Android: java.lang.IllegalStateException: base de datos xxx.db (conn # 0) ya cerrado

He leído un montón de temas acerca de este mensaje de error, pero no puedo resolver mi problema.

Tengo una aplicación en google play y recibo algunos informes de error de los usuarios. Cuando estoy probando la aplicación, todo funciona bien.

En la aplicación, estoy manejando una gran base de datos con algo así como 30 tablas. Estoy cerrando la base de datos en mi actividad principal onDestroy () y todos los cursores están cerrados cuando la consulta está terminada.

Realmente no sé por qué de vez en cuando los usuarios reciben este mensaje de error.

Aquí está el registro de errores completo:

java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2213) at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1565) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605) at mdpi.android.database.LocalDatabase.getHistoryLastSuccessfullUpdate(LocalDatabase.java:661) at mdpi.android.Journals$7.onItemClick(Journals.java:723) at android.widget.AdapterView.performItemClick(AdapterView.java:292) at android.widget.Gallery.onSingleTapUp(Gallery.java:960) at android.view.GestureDetector.onTouchEvent(GestureDetector.java:1310) at android.widget.Gallery.onTouchEvent(Gallery.java:937) at android.view.View.dispatchTouchEvent(View.java:5724) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1964) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1725) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2071) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) at android.app.Activity.dispatchTouchEvent(Activity.java:2426) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2019) at android.view.View.dispatchPointerEvent(View.java:5904) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3155) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2670) at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:1000) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2679) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4517) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) at dalvik.system.NativeStart.main(Native Method) 

Y otro:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{mdpi.android/mdpi.android.UserInformations}: java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237) at android.app.ActivityThread.access$600(ActivityThread.java:139) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:4974) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2194) at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1536) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1496) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1576) at mdpi.android.database.LocalDatabase.getUserInformations(LocalDatabase.java:357) at mdpi.android.UserInformations.onCreate(UserInformations.java:122) at android.app.Activity.performCreate(Activity.java:4538) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158) ... 11 more 

EDIT: Un nuevo error.

Hoy, tengo un nuevo error relacionado con el acceso a la base de datos:

 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:278) at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) at java.util.concurrent.FutureTask.setException(FutureTask.java:124) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) at java.util.concurrent.FutureTask.run(FutureTask.java:137) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) at java.lang.Thread.run(Thread.java:856) Caused by: java.lang.NullPointerException at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290) at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115) at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718) at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591) at mdpi.android.database.LocalDatabase.insertCountry(LocalDatabase.java:143) at mdpi.android.database.CountryTable.EnterCountry(CountryTable.java:21) at mdpi.android.UserInformations$insertCountryAsync.doInBackground(UserInformations.java:270) at mdpi.android.UserInformations$insertCountryAsync.doInBackground(UserInformations.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:264) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) ... 4 more 

onDestroy() sólo se llamará cuando la actividad se haya terminado / destruido / eliminado de la pila. Cuando se está moviendo fuera de la actividad onStop() se llamará. Si necesita mantener su diseño actual, solo llame cerca en onStop() . NOTA: onStop de la actividad actual se llamará después de onCreate / onRestart de la actividad nueva / siguiente.

Si usted tiene un solo DB usted puede utilizar una clase de SQLiteOpenHelper según lo mencionado por pawelieba También usted puede tener la referencia de sqlite db en la clase de la aplicación, y usted puede apenas utilizar la referencia en todas las actividades, como

((MyApplication)getApplication()).db

Basta con abrir el DB en onCreate() de la clase Application y cerrarlo en onTerminate() .

También puede echar un vistazo a otras respuestas SO para este error. Se ha pedido muchas veces antes.

Java.lang.illegalstateexception no abre la base de datos android

Android java.lang.IllegalStateException base de datos ya cerrada

Android inserta los datos Error de SQLite Causado por java.lang.IllegalStateException: base de datos no abierta

La base de datos SQLite tiene una interfaz nativa que es accesible a través de SQLiteDatabase : esta clase se encarga de sincronizar el acceso al SQLite nativo desde diferentes subprocesos.
SQLiteDatabase se almacena en caché en SQLiteOpenHelper que se encarga de proporcionar instancia de SQLiteDatabase , es patrón singleton.

De mi experiencia, usted debe tener una instancia de SQLiteOpenHelper y obtener en caché SQLiteDatabase de ella. Entonces usted no necesita tener cuidado para cerrar / abrir SQLiteDatabase .

Una instancia de SQLiteOpenHelper para la aplicación es necesaria para tener instancia única de SQLiteDatabase en la aplicación. Solucionará problemas con el acceso multi-threaded a la base de datos nativa.

En resumen: singleton de SQLiteOpenHelper desde el que se obtiene base de datos para cada consulta.
Estoy usando Roboguice para lidiar con el feo patrón singleton.

Tuve un problema similar en un proyecto en el que trabajé.

El proyecto utilizó una capa de acceso a datos (DAL) que era una clase abstracta con métodos estáticos utilizados para recuperar datos de una base de datos de sólo lectura. Los métodos abrieron una base de datos, recuperaron los datos y cerraron el db. Esto condujo a una excepción que se lanzó cuando el db se estaba cerrando. No siempre y no en todos los teléfonos.

El problema se fue cuando implementé un proveedor de contenido y lo usé en lugar del DAL.

Estar seguro

  • Cerrar cusor después de la consulta para obtener datos de sqlite.

  • Utilizar la transacción en la actualización, insertar a sqlite.

Pero algún tiempo tal vez utilizamos muchos JOIN en secuencias de consulta, creó la tabla del templo para consultar y tal vez no se cerró inmediatamente

  • ¿Qué bandera usar en SimpleCursorAdapter?
  • Java.lang.illegalstateexception no abre la base de datos android
  • SQLite de Android CursorIndexOutOfBounds
  • ¿Cuál es el uso de SQLiteDatabase.CursorFactory en Android?
  • Cambiar el nombre de la tabla en sqlite
  • Cómo extraer el cursor y el valor entero de una matriz de clase Object
  • ¿Debo usar siempre transacciones en android sqlite?
  • SQLite de Android usando db.query () para JOIN en lugar de rawquery ()
  • Cómo incrustar una fuente personalizada en la aplicación de Android (WebView)
  • Intento escribir una base de datos readonly ... pero no estoy
  • SQLiteDatabase.insertOrThrow no se lanza pero no se insertan datos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.