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 ...
Sí, definitivamente tiene más sentido que todas las respuestas. Aunque nunca pensé hacer eso. :) – mightimaus
gracias @ EverythingTech96, si esto resuelve tu problema, házmelo saber. – kdehairy