Pergunta

Não sei o que está causando esse erro, pois me certifiquei de fechar meu adaptador de banco de dados corretamente (pelo menos acho que estou).Aqui está o que o LogCat está dizendo (a tag de todos eles é AndroidRuntime):

EXCEÇÃO FATAL:Java.lang.illegalstateException:database /data/data/com.acedit.assignamo/databases/data.db (conn# 0) already closed at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2082) at android.database.sqlite.SQLiteDatabase. lock(SQLiteDatabase.java:413) at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:400) at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:79) at android.database.sqlite.SQLiteCursor .fillWindow(SQLiteCursor.java:164) at android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:147) at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:178) at android.support.v4.widget. CursorAdapter.getItemId(CursorAdapter.java:225) at android.widget.AbsListView.onSaveInstanceState(AbsListView.java:1569) at android.view.View.dispatchSaveInstanceState(View.java:9868) at android.view.ViewGroup.dispatchFreezeSelfOnly(ViewGroup .java: 2310) em android.widget.adapterview.dispatchSaveInstanceState (adapterview.java:770) em android.view.viewGroup.dispatchSaveInstanceState (ViewGroup.java:2296) Android.View.Savehierarth at android.support.v4.app.FragmentManagerImpl.saveFragmentViewState(FragmentManager.java:1561) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:962) at android.support.v4.app.FragmentManagerImpl.detachFragment (FragmentManager.java:1233) em android.support.v4.app.backstackrecord.run (backstackrecord.java:620) em android.support.v4pp.fragmentManagerImpl.execendactions (fragmentmanager.java:143) em andmpl.exeCendactos (fragmentmanager.java:143) a e v4.App.FragmentManagerImpl.ExecutionEningTransactions (fragmentManager.java:431) em android.support.v4.app.fragmentpagerAdapter.finishupdate (fragmentpageradapter.java:141) em android.support.v4VELPAVERADAPTER.JAVA:1) At Android.support.v4VELPAGERAPTER.JAVA:1) em android.support.v4VELPAGER.VIGYPTER.Java:1) em android.support.v4VELPAGER.VIGYPTER.VIGHT.JAVA:1) 895) em android.support.v4.view.viewPager.populate (viewPager.java:772) em android.support.v4.view.viewPager.compleTescroll (ViewPager.java:1539) At Android.suport.v4.View.Vager.java:1539) At Android.suport.v4 .computescroll (viewPager.java:1422) em android.view.view.getdisplaylist (view.java:10406) em android.view.viewGroup.dispatchgetdisplaylist (ViewGroup.java:2597) atndroid.view.viylisslaylist (ViewGroup.java:2597) atndroid.View.View.Veita java: 10380) em android.view.viewGroup.dispatchGetDisplayList (ViewGroup.java:2597) em android.view.view.getdisplaylist (view.java:10380) atndroid.view.view.dispatchgetDisplayListoup (ViewGrist) android.view.View.getDisplayList(View.java:10380) at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) at android.view.View.getDisplayList(View.java:10380) at android.view.HardwareRenderer $ GLRENDERER.DRAW (hardwarerenderer.java:875) em android.view.viewrootimpl.draw (viewrootimpl.java:1910) em android.view.viewrootimpl.performTraversals (viewrootimpl.java:1634) em Andr. Viewrootimpl.java:2442) em android.os.handler.dispatchmessage (handler.java:99) em android.os.looper.loop (looper.java:137) em android.app.activitythread.main (atividade de atividade.java:4575 ) em java.lang.reflect.method.invokenative (método nativo) em java.lang.reflect.method.invoke (method.java:511) em com.android.internal.os.zygoteinit $ methodandargscaller.run (zygoteinit.java : 786) em com.android.internal.os.zygoteinit.main (zygoteinit.java:553) em dalvik.system.nativestart.main (método nativo)

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

O Cursor voltou de fetchAllAssignments() é usado para preencher um ListView através de um costume CursorAdapter.O ListView é o conteúdo de um ListFragment, e há várias instâncias deste ListFragment exibidas em cada página de um ViewPager (uma para mostrar tarefas de todos os cursos e, em seguida, uma página para cada um dos cursos individuais).

Alguma idéia do que está errado?Pelo que eu sei, estou fechando meu banco de dados corretamente.Deixe-me saber se você precisar de mais código.Desde já, obrigado!

EDITAR: Os dados são extraídos do banco de dados corretamente e também preenchem o ListView.Posso percorrer as várias páginas, mas parece travar sempre que o Fragment é interrompido.Muitas vezes ele falha quando inicio outra atividade, mas nem sempre.Ocasionalmente, ele também trava quando estou passando pelas páginas, embora muito raramente.Aqui está meu método onPause() para meu Fragment (não tenho onStop() ou onDestroy()):

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

No meu onResume() Acabei de recarregar a lista do banco de dados e obter uma nova cópia do contexto via getActivity().Talvez algo esteja sendo apagado (para fins de memória) e eu não esteja recarregando?Não estou recebendo nenhum tipo de NullPointerException, então isso me parece improvável...

Foi útil?

Solução

na verdade, essa exceção é gerada porque você fecha seu banco de dados duas vezes, não porque não o fechou.

então..

em você close() método, substitua a seguinte linha em seu código:

if (db != null) {

com:

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

Outras dicas

Faça seu DbHelper um singleton, conforme descrito em esta postagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top