¿Es Sqlite Database thread de instancia seguro
Tengo una base de datos con algunas tablas. Quiero actualizar las tablas utilizando múltiples subprocesos. Utilizaré la misma instancia de SQLiteDatabase en todos los subprocesos.
Por favor sugiera si este enfoque es correcto. ¿Es la base de datos Sqlite threadsafe? ¿Pueden dos hilos diferentes actualizar la misma tabla para diferentes conjuntos de valores al mismo tiempo.
- Cómo utilizar DefaultDatabaseErrorHandler para controlar la corrupción de base de datos en Android
- SQL eliminar de una tabla + un jointable?
- Abrir y editar archivos PDF en la aplicación de Android con API
- Android MediaStore obtiene distintas carpetas de archivos de música
- Cómo utilizar join consulta en CursorLoader cuando su constructor no lo admite
- Tabla de SQLite con columnas de columna de enteros
- Consulta SQLite que contiene caracteres especiales
- Confuso respecto a SQLiteOpenHelper y crear varias tablas
- La columna _id no existe
- Android: utilice la base de datos SQLite en la tarjeta SD (no utilizando el almacén de datos Android interno)
- ¿Podemos usar una base de datos SQLITE aldready preparada para una aplicación phonegap?
- ¿Cuál es el uso de SQLiteDatabase.CursorFactory en Android?
- Portable JDBC vs SQLite en Android
[ERROR:] No, no es thread-safe de forma predeterminada. Debe utilizar métodos SQLiteHelper relacionados con el bloqueo para proporcionar seguridad en los subprocesos.
[EDIT]: La clase SQLiteDatabase proporciona un mecanismo de bloqueo de forma predeterminada (ver comentarios) y si está ejecutando multithread, no tiene que considerar cambiar nada para que tenga seguridad de subprocesos.
Buscar "hilo" en este documento: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
Y lea más sobre:
- http://www.touchtech.co/blog/android-sqlite-locking/
- Encriptación y bloqueo de bases de datos Android
- Android – SQLite + SharedPreferences, 2 Threads Simultánea de lectura / escritura?
- https://groups.google.com/forum/#!topic/android-developers/s3blUf7CRhU
El Android utiliza java mecanismo de bloqueo para mantener el acceso a la base de datos SQLite serializado. Por lo tanto, si el subproceso múltiple tiene una instancia de DB, siempre llama a la base de datos en forma serializada y, por supuesto, la base de datos es segura para subprocesos .
Si confirmamos que estamos utilizando la base de datos de un solo hilo, tuvimos la opción de establecer la base de datos de bloqueo interno desactivar mediante la llamada a setLockingEnable(false)
pero este método obtuvo obsoleto de API nivel 16 y ya no en uso. Si ve la implementación de este método en la clase SQLiteDatabase
, no encontrará nada escrito allí, es decir, método vacío.
public void setLockingEnabled (boolean lockingEnabled)
Este método ahora no hace nada. No utilice.
Una cosa que debemos cuidar de que es que debemos hacer una instancia de su clase de ayuda (es decir, haciendo singleton) y compartir la misma instancia a múltiples hilos y no llamar close()
en la base de datos entre la operación, de lo contrario puede obtener Siguientes excepciones:
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase
Por lo tanto, no llame a database.close()
entre el acceso a la base de datos, base de datos de auto realizar una operación de cierre interno cuando toda la operación sería terminar.
Puede controlar si la base de datos es segura o no de hilos por setLockingEnabled .
Controlar si el SQLiteDatabase se hace o no thread-safe utilizando cerraduras alrededor de secciones críticas. Esto es bastante caro, por lo que si sabe que su base de datos sólo se utilizará por un solo hilo, entonces debe establecer esto en falso. El defecto es cierto
Así que creo que esto responde a su pregunta.
El método setLockingEnabled se deprecia en el nivel API 16
Si lo haces
SetLockingEnabled (boolean lockingEnabled) Controla si SQLiteDatabase se hace o no thread-safe usando cerraduras alrededor de secciones críticas.