Pregunta

Estoy perplejo en cuanto a lo que está causando este error, como lo han hecho seguro de que soy el cierre de mi base de datos adaptador correctamente (al menos eso creo yo).Aquí es lo que LogCat dice (en la etiqueta de todos ellos es AndroidRuntime):

LA EXCEPCIÓN FATAL:principal java.lang.IllegalStateException:base de datos /data/data/com.acedit.assignamo/bases de datos/datos.db (conn# 0) ya está cerrado en android.la base de datos.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2082) en android.la base de datos.sqlite.SQLiteDatabase.de bloqueo(SQLiteDatabase.java:413) en android.la base de datos.sqlite.SQLiteDatabase.de bloqueo(SQLiteDatabase.java:400) en android.la base de datos.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:79) en android.la base de datos.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:164) en android.la base de datos.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:147) en android.la base de datos.AbstractCursor.moveToPosition(AbstractCursor.java:178) en android.apoyo.v4.widget.CursorAdapter.getItemId(CursorAdapter.java:225) en android.widget.AbsListView.onSaveInstanceState(AbsListView.java:1569) en android.vista.Vista.dispatchSaveInstanceState(Ver.java:9868) en android.vista.ViewGroup.dispatchFreezeSelfOnly(ViewGroup.java:2310) en android.widget.AdapterView.dispatchSaveInstanceState(AdapterView.java:770) en android.vista.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2296) en android.vista.Vista.saveHierarchyState(Ver.java:9851) en android.apoyo.v4.app.FragmentManagerImpl.saveFragmentViewState(FragmentManager.java:1561) en android.apoyo.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:962) en android.apoyo.v4.app.FragmentManagerImpl.detachFragment(FragmentManager.java:1233) en android.apoyo.v4.app.BackStackRecord.ejecutar(BackStackRecord.java:620) en android.apoyo.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431) en android.apoyo.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) en android.apoyo.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) en android.apoyo.v4.vista.ViewPager.rellenar(ViewPager.java:895) en android.apoyo.v4.vista.ViewPager.rellenar(ViewPager.java:772) en android.apoyo.v4.vista.ViewPager.completeScroll(ViewPager.java:1539) en android.apoyo.v4.vista.ViewPager.computeScroll(ViewPager.java:1422) en android.vista.Vista.getDisplayList(Ver.java:10406) en android.vista.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) en android.vista.Vista.getDisplayList(Ver.java:10380) en android.vista.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) en android.vista.Vista.getDisplayList(Ver.java:10380) en android.vista.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) en android.vista.Vista.getDisplayList(Ver.java:10380) en android.vista.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) en android.vista.Vista.getDisplayList(Ver.java:10380) en android.vista.HardwareRenderer$GlRenderer.dibujar(HardwareRenderer.java:875) en android.vista.ViewRootImpl.dibujar(ViewRootImpl.java:1910) en android.vista.ViewRootImpl.performTraversals(ViewRootImpl.java:1634) en android.vista.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) en android.os.Controlador.dispatchMessage(Controlador.java:99) en android.os.Looper.loop(Bucle.java:137) en android.app.ActivityThread.principal(ActivityThread.java:4575) en java.lang.reflejar.Método.invokeNative(Native Method) en java.lang.reflejar.Método.invoke(Método.java:511) en com.android.interna.os.ZygoteInit$MethodAndArgsCaller.ejecutar(ZygoteInit.java:786) en com.android.interna.os.ZygoteInit.principal(ZygoteInit.java:553) en dalvik.sistema.NativeStart.principal(Native Method)

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 regresó de fetchAllAssignments() se utiliza para rellenar una ListView a través de una costumbre CursorAdapter.El ListView es el contenido de un ListFragment, y hay varias instancias de este ListFragment que se muestran en cada página de un ViewPager (uno para mostrar las asignaciones de todos los cursos y, a continuación, una página para cada uno de los cursos).

Alguna idea de lo que está mal?Hasta donde yo sé, estoy cerrando mi base de datos correctamente.Déjeme saber si usted necesita más de código.Gracias de antemano!

EDITAR: Los datos se extraen de la base de datos de la multa, y rellena el ListView así.Me puede deslizar el dedo a través de las diferentes páginas, pero parece bloquearse cuando el Fragmento se detiene.A menudo se bloquea cuando empiezo a otra Actividad, pero no siempre.También ocasionalmente se bloquea cuando estoy pasando a través de las páginas, aunque muy rara vez.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 volver a cargar la lista de la base de datos y obtener una nueva copia del contexto a través de getActivity().Tal vez algo se está poniendo desactivada (para la memoria) y no estoy de cargarla?No estoy recibiendo ningún tipo NullPointerException, por lo que esto parece poco probable que me...

¿Fue útil?

Solución

esta excepción es realmente elevado, ya que el doble de cerrar la base de datos, no porque no la cierre.

así que..

en ti close() método, vuelva a colocar la siguiente línea en el código:

if (db != null) {

con:

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

Otros consejos

Hacer su DbHelper un singleton, como se describe en este post.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top