Base de datos de Android bloqueada

Estoy recibiendo un error de seguimiento. Entonces, ¿cómo deslocking mi base de datos?

10-28 08:43:26.510: ERROR/AndroidRuntime(881): FATAL EXCEPTION: Thread-11 10-28 08:43:26.510: ERROR/AndroidRuntime(881): android.database.sqlite.SQLiteDatabaseLockedException: database is locked 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:742) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at com.aa.me.vianet.dbAdapter.DbAdapter.open(DbAdapter.java:25) 10-28 08:43:26.510: ERROR/AndroidRuntime(881): at com.aa.me.vianet.services.NotificationManagerThread.run(NotificationManagerThread.java:49) 

Creo que olvidó cerrar la base de datos, u otro hilo está escribiendo en la base de datos cuando intenta escribir en él. SQLite bloquea la base de datos cuando está escribiendo para evitar daños si otra entidad intenta escribir en la misma base de datos al mismo tiempo. Android, solo mostrará un error en el registro de cat, y la consulta que proporcionó será olvidada …

Entonces, yo recomiendo:

  • Solo accede a la base de datos desde un SQLOpenHelper
  • Asegúrate de cerrar todas las instancias de los ayudantes de la base de datos una vez que hayas terminado con ellos
  • Asegúrese de que siempre finaliza las transacciones con endTransaction() también si no las establece correctamente (es decir, si desea devolverlas), en caso de que utilice transacciones
  • Podrías tratar de usar OrmLite , no lo he usado, pero he escuchado a otros aquí elogiarlo.

Use una sola conexión en toda su aplicación. Mira aquí:

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

La razón por la que esto sucede es porque solo puede tener una conexión a la base de datos abierta a la vez (esto es para evitar condiciones de carrera al modificar la base de datos). Supongo que su conexión varias veces a su base de datos de diferentes hilos? La forma más sencilla de evitar esto es crear una interfaz de ContentProvider para su base de datos. Esto podrá manejar consultas de múltiples hilos.

Para más información, revisa este blogpost .

Tuve el mismo problema, intenta usar esto

  db.beginTransactionNonExclusive(); try { //do some insertions or whatever you need db.setTransactionSuccessful(); } finally { db.endTransaction(); } 

Intenté con db.beginTransaction pero bloqueó el bd

Tuve un error similar. Mi problema fue que accidentalmente di las bases de datos de las dos clases auxiliares con el mismo nombre, por lo que terminaron accediendo a la misma base de datos simultáneamente. Por lo tanto, asegúrese de no acceder a una única base de datos con múltiples clases de ayuda.

Tuve el mismo problema ya que estaba tratando de acceder a mi base de datos a través de un ContentResolver mientras que ya tenía una conexión directa de SQLiteDatabase abierta (requerida para las transacciones).

Lo resolví cambiando el orden de mi código para que las cosas de ContentResolver se hagan antes de que se SQLiteDatabase mi conexión directa de SQLiteDatabase .

También SQLiteDatabase algunos códigos, por lo que ya no cierro mi SQLiteDatabase directa.

Vale la pena leer esta respuesta, ya que proporciona muchas otras orientaciones útiles.