Lectura y escritura simultánea SQLite

He leído muchos temas, pero no puedo entender la respuesta a la pregunta: ¿es posible leer y escribir simultáneamente?

Tengo un hilo de fondo que actualiza algunos datos y la IU necesita pequeños datos almacenados en DB. Entonces, en la interfaz de usuario se realiza la operación SELECCIONAR hilo. Pero bloquea cuando la actualización está en progreso. Como resultado, la IU se congela durante varios segundos.

¿Alguien tiene éxito en la lectura de DB al escribir?


Es posible leer y escribir en DB en iPhone. ¿La razón de tal diferencia está en la implementación sincrónica de wrapper en funciones sqlite nativas?

En Android 3.0 y versiones posteriores, SQLiteDatabases admite el modo WAL (registro por escritura anticipada):

Cuando el registro de escritura anticipada no está habilitado (el valor predeterminado), no es posible que las lecturas y escrituras se realicen en la base de datos al mismo tiempo. Antes de modificar la base de datos, el escritor adquiere implícitamente un locking exclusivo en la base de datos que impide que los lectores accedan a la base de datos hasta que se complete la escritura.

Por el contrario, cuando el registro de escritura anticipada está habilitado, las operaciones de escritura se realizan en un archivo de registro separado que permite que las lecturas continúen simultáneamente. Mientras una escritura está en progreso, los lectores de otros hilos percibirán el estado de la base de datos tal como estaba antes de que comenzara la escritura. Cuando finalice la escritura, los lectores de otros hilos percibirán el nuevo estado de la base de datos.

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#enableWriteAheadLogging ()

Para iniciar una transacción en modo WAL use beginTransactionNonExclusive () en lugar de beginTransaction (). Mientras beginTransaction () inicia una transacción en modo EXCLUSIVE, beginTransactionNonExclusive () inicia una en modo INMEDIATO

  • El modo EXCLUSIVO usa lockings exclusivos ( http://www.sqlite.org/lockingv3.html#excl_lock ) lo que significa que ninguna otra conexión de base de datos excepto las conexiones read_uncommitted podrá leer la base de datos y ninguna otra conexión sin excepción podrá escribir el base de datos hasta que se complete la transacción
  • El modo INMEDIATO usa lockings reservados ( http://www.sqlite.org/lockingv3.html#reserved_lock ) lo que significa que ninguna otra conexión a la base de datos podrá escribir en la base de datos o hacer un BEGIN INMEDIATE o BEGIN EXCLUSIVE, otros procesos pueden seguir leyendo de la base de datos, sin embargo.

En palabras más simples: llame a beginTransactionNonExclusive () para el modo IMMEDIATE y podremos leer mientras está escribiendo otro hilo (el estado anterior a la transacción de escritura iniciada porque no usaremos read_uncommitted connections -> http://en.wikipedia.org/wiki/ Isolation_% 28database_systems% 29 # Dirty_reads ).

No puedes leer y escribir al mismo tiempo. SQLite es una base de datos sin servidor y basada en archivos.

De las preguntas frecuentes de SQLite:

“Cuando cualquier proceso desea escribir, debe bloquear todo el archivo de la base de datos mientras dure su actualización. Pero eso normalmente solo lleva unos pocos milisegundos. Otros procesos simplemente esperan que el escritor finalice y luego continúan con sus actividades. Otra base de datos SQL incorporada los motores generalmente solo permiten que un solo proceso se conecte a la base de datos de una vez “.

Comenzando con API 11 Android tiene soporte para modo WAL. Mantiene los datos originales intactos durante la transacción, por lo que otros subprocesos pueden leer cuando se está ejecutando la transacción. Puede consultar mi artículo para más detalles sobre el modo WAL:

http://www.skoumal.net/en/parallel-read-and-write-in-sqlite/

También debe evitar ejecutar consultas de bases de datos en el hilo de UI. Siempre puede volverse lento y bloquear tu UI.

No es posible leer y escribir simultáneamente. Sin embargo, si tiene las clases de base de datos SQLite configuradas correctamente (instancia única de sus clases DB y helper), diferentes hilos deberían poder tomar la conexión DB sincrónicamente para que no haya un desfase notable.

También parece que estás intentando hacer un back-end (escribir en el archivo db) con tu hilo de interfaz de usuario. No deberías estar haciendo esto. Cree una AsyncTask para manejar esto en lugar de tener que manejar su subproceso de interfaz de usuario.

Consulte la documentación de SQLiteOpenHelper . Aquí hay una publicación anterior que habla sobre esto también: ¿Cuáles son las mejores prácticas para SQLite en Android?