Leer datos de sqlite cuando se está ejecutando una transacción (Android)

Necesito leer algunos datos de una base de datos mientras tanto estoy cargando algunos datos en otro hilo con una transacción.

Todos mis subprocesos para leer otras tablas se detienen hasta que se termina la transacción en otro subproceso.

Tengo que ser capaz de leer la información de la base de datos sin preocuparse por el otro hilo.

He leído un montón de información sobre sqlite, android … pero nada funciona, siempre se bloquea mi consulta para leer los parámetros.

He seguido este consejos como @KevinGalligan dice en este hilo ( ¿Cuáles son las mejores prácticas para SQLite en Android? ) Resolución de bloqueos y otros problemas.

1) Estoy usando solamente un SQLiteOpenHelper (singleton)

2) Nunca he cerrado la base de datos

He intentado:

Iniciar la transacción con:

database.execSQL("begin immediate transaction"); 

o

 database.beginTransactionNonExclusive(); 

en lugar

 database.beginTransaction(); 

No funciona, consulta bloqueada.

He leído sobre WAL (database.enableWriteAheadLogging ()), pero necesito api 9.

¿Alguna otra solución para leer mientras tanto una transacción está actualizando algunas tablas? No me importa si mi información es obsoleta, es más importante no bloquear mis hilos.

Resolví el problema.

Seguí estos pasos.

Para resolver el problema de bloqueo de base de datos y multi-threading uso de la base de datos (Basado en http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection ):

1) Estoy usando solamente un SQLiteOpenHelper (singleton).

2) Nunca cierre la base de datos.

Para poder leer y escribir sin bloquear mis consultas, seguí estos pasos:

Use database.enableWriteAheadLogging() (sólo api> = 11), mi error fue que debes activar este modo en todas las conexiones, no solo en tu transacción o tus escritos, así que agregué el siguiente código a mi clase openHelper en "onOpen ". Basado en este código de Mozilla en github ( https://github.com/mozilla/mozilla-central/blob/9f2b8297b99d9d28038256b4f92a5aaa941749f1/mobile/android/base/db/TabsProvider.java ).

 @SuppressLint("NewApi") @Override public void onOpen(SQLiteDatabase db) { // From Honeycomb on, it's possible to run several db // commands in parallel using multiple connections. if (Build.VERSION.SDK_INT >= 11) { try{ db.enableWriteAheadLogging(); }catch(Exception e){ Log.e("onOpen", e.getMessage()); } } } 

Con esta solución resolví mi problema de bloqueo de lecturas mientras estoy actualizando algunas tablas, pero otras actualizaciones también están bloqueadas. Si desea resolver este último problema, como @commonsware dice:

Utilizando yieldIfContendedSafely() dentro de su transacción le dará a otros hilos una oportunidad de trabajar con la base de datos. No he visto ninguna diferencia usando este método con beginTransaction o beginTransactionNonExclusive .

Otra lectura interesante es: ¿Cuáles son las mejores prácticas para SQLite en Android?

Creo que usted debe utilizar el concepto de sincronización para evitar los problemas que se enfrentan.

El SQLite en android no es thread-safe, la base de datos se bloqueará cuando se ejecuta una operación, lo que significa que debe asegurarse de que la operación de la base de datos se ejecute en un solo hilo e invocar database.setTransactionSuccessful (); Para terminar la transacción cuando su trabajo esté terminado.

Si su trabajo de carga de datos no es sólo una transacción masiva de SQL, use yieldIfContendedSafely() para permitir que sus otros subprocesos lean la base de datos en varios puntos. Así, por ejemplo, si está realizando algún tipo de carga de datos a granel y está realizando una transacción cada 100 insertos, llame a yieldIfContendedSafely() en cada paso del bucle de cada 100 insertos para darle a sus otros hilos la oportunidad de trabajar Con la base de datos.

  • Una buena biblioteca de ORM de Java en Android
  • No puede ver datos Sqlite con adaptador simple
  • Cómo evitar errores de bloqueo de SQLiteException
  • La transacción de Sqlite bloquea Android ui
  • Cómo convertir el objeto de cursor en XML o JSON en android
  • Cómo obtener los nombres de todas las tablas presentes en una base de datos en Android lite de SQL
  • Bucle a través de un Cursor SQLite lleva demasiado tiempo
  • Adición de filas a una base de datos sqlite mediante un bucle (Phonegap)
  • ¿Es posible acceder a la base de datos SQLite de una aplicación para Android en mi teléfono?
  • NoClassDefFoundError al usar greenDao
  • Leer desde una base de datos en android a un arraylist
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.