Frage

Ich weiß nicht, was diesen Fehler verursacht, da ich sichergestellt habe, dass ich meinen Datenbankadapter ordnungsgemäß schließe (zumindest glaube ich, dass ich das tue).Das sagt LogCat (das Tag für alle ist AndroidRuntime):

FATALE AUSNAHME:Haupt Java.lang.ILLEGALSTATEException:Datenbank /data/data/com.aaten.assignamo/databases/data.db (Conn# 0) bereits geschlossen bei android.database.sqlite.sqlitedatabase.Verifydbisopen ( lock (sqlitedatabase.java:413) at android.database.sqlite.sqlitedatabase.lock (sqlitedatabase.java:400) at android.database.sqlite.sqlitequery.fillwindow.database.database.database (sqlite.javery.java:79) bei Android. .Fillwindow (sqlitecursor.java:164) at android.database.sqlite.sqlitecursor.onmove (sqlitecursor.java:147) at android.database.abstractcursor.movetoposition (Abstractcursor.javaSor. Cursoradapter.getItemid (cursoradapter.java:225) at android.widget.abslistView.onsaveinstancestate (AbslistView.java:1569) at android.view.view.dispatchsavEnstancestate (View.java:9868) at Android.view.VowocaGrogrogrogrogrogrogfrowokly (java:9868) at Android. .Java: 2310) at android.widget.AdapterView.Dispatchsaveinstancestate (adapterview.java:770) at android.view.viewgroup.dispatchsaveinstancestate (ViewGroup.java:296) bei Android.view.view.view.Saveh.Saveh.Saveh.Saveh. at android.support.v4.app.fragmentManagerImpl.saveFragmentViewState (FragmentManager.java:1561) at Android.support.v4.app.FragmentManagerImpl.Movetostate (fragmentManager.java:962) unter Android.support.v.v4.V4.V4.V4.V4.V4.V.V. (FragmentManager.java:1233) at android.support.v4.app.backstackRecord.run (BackstackRecord.java:620) at Android.support.v4.app.FragmentManagerImpl.execpendingactions (FragmentManager.java:1431) at Android.Support. v4.App.FragmentManagerImpl.executePendingTransactions (FragmentManager.java:431) at android.support.v4.app.FragmentpagerAdapter.FinishUpdate (fragmentpagerAdapter.java:141) at android.support.v4.v4.v.v.View.View.v.V.V. 895) at android.support.v4.view.ViewPager.populate(ViewPager.java:772) at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1539) at android.support.v4.view.ViewPager .computeScroll(ViewPager.java:1422) at android.view.View.getDisplayList(View.java:10406) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) at android.view.View.getDisplayList(View. Java: 10380) at android.view.viewgroup.dispatchgetDisplayList (ViewGroup.java:2597) at Android.view.getdisplaylist (view.java:10380) unter Android.viewgGroup.DispatchgetGetGetGetGePlist (ViewGroup.VectGroup. android.view.view.getDisplayList (view.java:10380) at android.view.viewgroup.dispatchgetdisplayList (ViewGroup.java:2597) at android.view.view.getDisplayList (View.java:10380) unter android.view.hardwarerersalerererererererererererererer - $ Glrenderer.draw (hardwarerenderer.java:875) at android.view.viewrootimpl.draw (viewrootimpl.java:1910) unter android.view.viewrootimpl.PerformTravers (viewrootimPl.java:1634) at androdroid.view.view.view.view.view.view.view.view.view.java:1634) at Android.view.view.view.view.view.view.view.view.view.view.view.view.VectimPl.java. ViewRootImpl.java:2442) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4575 ) bei java.lang.reflect.method.inVokenative (native Methode) unter java.lang.reflect.method.invoke (method.java:511) unter com.android.internal.os.zygoteinit $ methodandArgscaller.run (Zygotinit.java : 786) unter com.android.internal.os.zygoteinit.main (Zygoteinit.java:553) bei Dalvik.System.nativestart.main (native Methode)

Mein Code:

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.");
}

Der Cursor zurückgekehrt von fetchAllAssignments() wird verwendet, um a zu füllen ListView durch einen Brauch CursorAdapter.Der ListView ist der Inhalt von a ListFragment, und auf jeder Seite eines ViewPagers werden mehrere Instanzen dieses ListFragment angezeigt (eine zum Anzeigen von Aufgaben aus allen Kursen und dann eine Seite für jeden einzelnen Kurs).

Irgendwelche Ideen, was falsch ist?Soweit ich weiß, schließe ich meine Datenbank korrekt.Lassen Sie mich wissen, wenn Sie mehr Code benötigen.Dank im Voraus!

BEARBEITEN: Die Daten werden problemlos aus der Datenbank abgerufen und füllen auch die ListView auf.Ich kann durch die verschiedenen Seiten wischen, aber es scheint immer dann abzustürzen, wenn das Fragment angehalten wird.Es stürzt oft ab, wenn ich eine andere Aktivität starte, aber nicht immer.Gelegentlich stürzt es auch ab, wenn ich durch die Seiten scrolle, wenn auch sehr selten.Hier ist meine onPause()-Methode für mein Fragment (ich habe kein onStop() oder onDestroy()):

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

In meinem onResume() Ich lade einfach die Liste aus der Datenbank neu und erhalte eine neue Kopie des Kontexts über getActivity().Vielleicht wird etwas gelöscht (aus Speichergründen) und ich lade es nicht neu?Ich erhalte keinerlei NullPointerException, daher erscheint mir dies unwahrscheinlich ...

War es hilfreich?

Lösung

Diese Ausnahme wird tatsächlich ausgelöst, weil Sie Ihre Datenbank doppelt schließen, und nicht, weil Sie sie nicht geschlossen haben.

Also..

in Ihnen close() -Methode ersetzen Sie die folgende Zeile in Ihrem Code:

if (db != null) {

mit:

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

Andere Tipps

Mach dein DbHelper ein Singleton, wie in beschrieben dieser Beitrag.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top