5

No sé qué está causando este error, ya que me he asegurado de cerrar correctamente el adaptador de la base de datos (al menos creo que lo estoy). Esto es lo que el dicho de LogCat (la etiqueta para todos ellos es Android Runtime):IllegalStateException: base de datos ya cerrada (con ViewPager)

excepción grave: principal java.lang.IllegalStateException: /data/data/com.acedit.assignamo/databases/data.db base de datos (conn # 0) ya cerrado en android.database.sqlite.SQLiteDatabase.verifyDbIsOpen (SQLiteDatabase.java:2082) en android.database.sqlite.SQLiteDatabase.lock (SQLiteDatabase.java:413) en android.database.sqlite. SQLiteDatabase.lock (SQLiteDatabase.java:400) en android.database.sqlite.SQLiteQuery.fillWindow (SQLiteQuery.java:79) en android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:164) en y roid.database.sqlite.SQLiteCursor.onMove (SQLiteCursor.java:147) en android.database.AbstractCursor.moveToPosition (AbstractCursor.java:178) en android.support.v4.widget.CursorAdapter.getItemId (CursorAdapter.java: 225) en android.widget.AbsListView.onSaveInstanceState (AbsListView.java:1569) en android.view.View.dispatchSaveInstanceState (View.java:9868) en android.view.ViewGroup.dispatchFreezeSelfOnly (ViewGroup.java:2310) en android.widget.AdapterView.dispatchSaveInstanceState (AdapterView.java:770) en android.view.ViewGroup.dispatchSaveInstanceState (ViewGroup.java:2296) en android.view.View.saveHierarchyState (View.java:9851) en android.support.v4.app.FragmentManagerImpl.saveFragmentViewState (Fragme ntManager.java:1561) en android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:962) en android.support.v4.app.FragmentManagerImpl.detachFragment (FragmentManager.java:1233) en android. support.v4.app.BackStackRecord.run (BackStackRecord.java:620) en android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1431) en android.support.v4.app.FragmentManagerImpl.executePendingTransactions (FragmentManager.java:431) en android.support.v4.app.FragmentPagerAdapter.finishUpdate (FragmentPagerAdapter.java:141) en android.support.v4.view.ViewPager.populate (ViewPager.java:895) en android. support.v4.view.ViewPager.populate (ViewPager.java:772) en android.support.v4.vi ew.ViewPager.completeScroll (ViewPager.java:1539) en android.support.v4.view.ViewPager.computeScroll (ViewPager.java:1422) en android.view.View.getDisplayList (View.java:10406) en android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597) en android.view.View.getDisplayList (View.java:10380) en android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597) en android. view.View.getDisplayList (View.java:10380) en android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597) en android.view.View.getDisplayList (View.java:10380) en android.view. ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597) en android.view.View.getDisplayList (View.java:10380) en android.view.HardwareRenderer $ GlRenderer.draw (HardwareRenderer.java:875) en android.view.ViewRootImpl.draw (ViewRootImpl.java:1910) en android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1634) en android.view.ViewRootImpl.handleMessage (ViewRootImpl.java:2442) en android.os.Handler.dispatchMessage (Handler.java:99) en android.os.Looper.loop (Looper.java:137) en android.app.ActivityThread.main (ActivityThread.java:4575) en java.lang.reflect.Method.invokeNative (Método nativo) en java.lang.reflect.Method.invoke (Method.java:511) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:786) en com .android.internal.os.ZygoteInit.main (ZygoteInit.java:553) en dalvik.system.NativeStart.main (Método nativo)

Mi código:

public Cursor fetchIncompleteAssignments(Short course) { 
    DbAdapter adapter = new DbAdapter(context, null, Values.ASSIGNMENT_TABLE); 
    adapter.open(); 

    Cursor r; 
    if (course == null) // Fetching from all courses 
     r = adapter.fetchAllWhere(Values.ASSIGNMENT_LIST_FETCH, Values.ASSIGNMENT_KEY_STATUS + "=" + 0, Values.ASSIGNMENT_KEY_DUE_DATE); 
    else 
     r = adapter.fetchAllWhere(Values.ASSIGNMENT_LIST_FETCH, Values.ASSIGNMENT_KEY_COURSE + "=" + course 
      + " AND " + Values.ASSIGNMENT_KEY_STATUS + "=" + 0, Values.ASSIGNMENT_KEY_DUE_DATE); 
    adapter.close(); 
    return r; 
} 

// Part of DbAdapter: 
public DbAdapter open() throws SQLException { 
    dbHelper = new DatabaseHelper(context); 
    db = dbHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    if (db != null) { 
     try { 
      db.close(); 
      dbHelper.close(); 
     } catch (NullPointerException e) { 
      Log.e("Close", "Error: " + e + " " + e.getMessage()); 
     } 
    } else 
     Log.e("Close", "Error! db \"" + DATABASE_TABLE + "\" is null."); 
} 

El Cursor regresaron de fetchAllAssignments() se utiliza para completar un ListView a través de un CursorAdapter personalizado. El ListView es el contenido de un ListFragment, y hay varias instancias de este ListFragment visualizadas en cada página de un ViewPager (una para mostrar las asignaciones de todos los cursos, y luego una página para cada uno de los cursos).

¿Alguna idea de qué es lo que está mal? Por lo que sé, estoy cerrando mi base de datos correctamente. Avíseme si necesita más código. ¡Gracias por adelantado!

EDIT: Los datos se extraen de la base de datos y también completan ListView. Puedo deslizarme por las distintas páginas, pero parece bloquearse cada vez que se detiene el Fragmento. A menudo se bloqueará cuando empiece otra Actividad, pero no siempre. También se bloqueará de vez en cuando cuando navego por las páginas, aunque muy raramente. Aquí está mi onPause() Método para mi Fragmento (no tengo una onStop() o OnDestroy()):

public void onPause() { 
    super.onPause(); 
    if (!assignmentsCursor.isClosed()) { 
     assignmentsCursor.close(); 
     assignmentsCursor = null; 
    } 
} 

En mi onResume() acabo de recargar la lista de la base de datos y obtener una nueva copia de la contexto a través del getActivity(). Tal vez algo se está limpiando (por razones de memoria) y no lo estoy recargando. No recibo ningún tipo de NullPointerException, así que esto me parece poco probable ...

Respuesta

3

esta excepción en realidad se plantea porque doble su base de datos, no porque no la cerró.

así ..

en que close() método, reemplace la línea siguiente en el código:

if (db != null) { 

con:

if (db != null && db.isOpen()) { 
+0

Sí, definitivamente tiene más sentido que todas las respuestas. Aunque nunca pensé hacer eso. :) – mightimaus

+0

gracias @ EverythingTech96, si esto resuelve tu problema, házmelo saber. – kdehairy

2

Haga de su DbHelper un singleton, como se describe en this post.

+0

Creo que ayudó. Todavía se cuelga ocasionalmente, pero pienso mucho menos. Buen consejo de todos modos, gracias! :) ¿Alguna otra idea? – mightimaus

+0

Si ha convertido su 'DbHelper' en singleton, no debería tener que cerrarlo. –

+0

¿Debo cerrar mi 'SQLiteDatabase' (' db')? – mightimaus

Cuestiones relacionadas