Domanda

Sono scatenato da ciò che sta causando questo errore, come ho assicurato che sto chiudendo correttamente il mio adattatore del database (almeno penso che io sia). Ecco cosa dice il logcat (il tag per tutti loro è Androidruntime):

.

Eccezione fatale: principale java.lang.illegalstateException: database /data/data/com.acedit.assignamo/databases/data.db (Conn # 0) già chiuso su Android.Database.sqlite.sqliteDatabase.VifyDbisOpen (sqlitedataabase.java:2082) su Android.Database.sqlite.sqlitedAtabase.lock (sqlitedatabase.java:413) su Android.Database.sqlite.sqliteDatabase.lock (sqlitedatabase.java:400) su Android.Database.sqlite.sqlitequery.fillwindow (sqlitequery.java:79) su Android.Database.sqlite.sqlitecursor.fillwindow (sqlitecursor.java:164) su Android.Database.sqlite.sqliteCursor.onmove (sqlitecursor.java:147) A Android.Database.abstractCursor.Movetoposition (AbstractCursor.java:178) A Android.Support.v4.widget.CursoradaPter.getitemid (cursoradapter.java:225) a Android.Widget.AbslistView.InsaveInstancestate (AbslistView.java:1569) A Android.view.view.DispatchSaveInstancestate (view.java:9868) A Android.View.ViewGroup.DispatchFreeZeselfonly (ViewGroup.java:2310) su Android.Widget.AdapterView.DispatchSaveInstancestate (AdapterView.java:770) A Android.View.viewGroup.DispatchSaveInstancestate (viewGroup.java:2296) A Android.View.View.VieveHerArchystate (view.java:9851) su Android.Support.v4.app.fragmentmanagerimpl.savefragmentviewState (frammentmanager.java:1561) su Android.Support.v4.app.fragmentmanagerimpl.movetostate (frammentmanager.java:962) A Android.Support.v4.app.fragmentmanagerimpl.detachfragment (frammentmanager.java:1233) su Android.Support.v4.app.backstackrecord.run (backstackrecord.java:620) su Android.Support.v4.app.FRAGMENTMANAGERIMPL.EXECENGENDATIONS (frammentmanager.java:1431) su Android.Support.v4.app.FRAGMENTMANAGERIMPL.ExecuTependingTransations (frammentmanager.java:431) su Android.Support.v4.app.fragmentpageradapter.finishupdate (frammentpageradapter.java:141) A Android.Support.v4.View.ViewPager.Populate (ViewPager.java:895) su Android.Support.v4.View.ViewPager.populate (ViewPager.java:772) su Android.Support.v4.view.ViewPager.completScroll (ViewPager.java:1539) su Android.Support.v4.view.ViewPager.comPutesCroll (ViewPager.java:1422) su Android.view.view.GetDisplaylist (view.java:10406) a Android.view.viewgroup.dispatchGetDisplaylist (viewGroup.java:2597) a Android.view.view.GetDisplaylist (view.java:10380) a Android.view.viewgroup.dispatchGetDisplaylist (viewGroup.java:2597) a Android.view.view.GetDisplaylist (view.java:10380) a Android.view.viewgroup.dispatchGetDisplaylist (viewGroup.java:2597) a Android.view.view.GetDisplaylist (view.java:10380) a Android.view.viewgroup.dispatchGetDisplaylist (viewGroup.java:2597) a Android.view.view.GetDisplaylist (view.java:10380) A Android.View.HardWareRenderer $ GLRENDERER.DRAW (hardwarererendender.java:875) A Android.View.ViewRootimpl.Draw (Viewrootimpl.java:1910) A Android.View.ViewRootimpl.performstraversals (Viewrootimpl.java:1634) A Android.View.ViewRootimpl.HandleMessage (Viewrootimpl.java:2442) su Android.os.Handler.DispatchMessage (Handler.java:99) su Android.os.Looper.Loop (Looper.java:137) a Android.App.ActivityThread.main (ActivityThread.java:4575) a java.lang.reflect.method.invenative (metodo nativo) a java.lang.reflect.method.invoke (metodo.java:511) a com.android.internal.os.zygoteinit $ metodthandargSaller.Run (zygoteinit.java:786) al com.android.internal.os.zygoteinit.main (zygoteinit.java:553) su Dalvik.system.nativestart.main (metodo nativo)

Il mio codice:

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

Il Cursor restituito da fetchAllAssignments() viene utilizzato per popolare un ListView attraverso un CursorAdapter personalizzato. Il ListView è il contenuto di un ListFragment e ci sono più istanze di questa lista di listino visualizzati in ciascuna pagina di un Viewpager (uno per mostrare i compiti da tutti i corsi, e quindi una pagina per ciascuno dei singoli corsi).

Qualche idea da ciò che è sbagliato? Per quanto ne so, sto chiudendo correttamente il mio database. Fammi sapere se hai bisogno di più codice. Grazie in anticipo!

Modifica: I dati vengono estratti dal database FINE e popola anche ListView. Posso scorrere le varie pagine, ma sembra schiantarsi ogni volta che il frammento è fermato. Spesso si schianterà quando inizio un'altra attività, ma non sempre. Occasionalmente occasionalmente si schianterà quando sto facendo scorrere le pagine, anche se molto raramente. Ecco il mio metodo in pausa () per il mio frammento (non ho un Onstop () o OnDestroy ()):

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

Nel mio onResume() ho appena ricaricato la lista dal database e ottieni un n

copia EW del contesto tramite getActivity().Forse qualcosa viene cancellato (per scopi di memoria) e non lo ricaricando?Non sto ottenendo alcun tipo di NullPointerException, quindi questo sembra improbabile per me ...

È stato utile?

Soluzione

Questa eccezione è in realtà sollevata perché si chiude il tuo database, non perché non l'hai chiuso.

Allora ..

In You close() Method, sostituire la seguente riga nel codice:

if (db != null) {
.

Con:

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

Altri suggerimenti

Rendi il tuo DbHelper a Singleton, come descritto in Questo post .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top