5

データベースアダプターが正常に終了していることを確認しているため、このエラーの原因については困惑しています。IllegalStateException:データベースが既に閉じられている(ViewPagerを使用)

致命的な例外:メイン java.lang.IllegalStateException:データベース/data/data/com.acedit.assignamo/databases/data.db(ここでLogCatのことわざ(それらのすべてのタグがAndroidRuntimeある)ものですconn#0)は既にandroid.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2082)の を閉じていました。android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:413)の android.database.sqlite。 SQLiteDatabase.lock android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:164)で(SQLiteDatabase.java:400)android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:79)で ATおよび(SQLiteCursor.java:147)android.database.AbstractCursor.moveToPosition(AbstractCursor.java:178) android.support.v4.widget.CursorAdapter.getItemId(CursorAdapter.java: 225) android.widget.AbsListView.onSaveInstanceState(AbsListView.java:1569) at android.view.View.dispatchSaveInstanceState(View.java:9868) at android.view.ViewGroup.dispatchFreezeSelfOnly(ViewGroup.java:2310) android.view.View.saveHierarchyStateでandroid.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2296) でandroid.widget.AdapterView.dispatchSaveInstanceState(AdapterView.java:770) (View.java:9851) ででandroid.support.v4.app.FragmentManagerImpl.saveFragmentViewState(Fragme ntManager.java:1561) android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:962) (android.support.v4.app.FragmentManagerImpl.detachFragment(FragmentManager.java:1233) 、android)にあります。 ())。 FragmentManager.java:431) android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) (android.support.v4.view.ViewPager.populate(ViewPager.java:895) 、android)にあります。 support.v4.view.ViewPager.populate(ViewPager.java:772) android.support.v4.vi ew.ViewPager.completeScroll(ViewPager.java:1539) android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1422) android.view.View.getDisplayList(View.java:10406) at android.view.View.View.View.ViewGroupDispatchGetDisplayList(ViewGroup.java:2597) (android.view.View.getDisplayList(View.java:10380)) (android.view.View.View.GetDisplayList(ViewGroup.java:2597)) はandroidです。 view.View.View.getDisplayList(View.java:10380) android.view.View.View.View.View.View.View.GateDisplayList(ViewGroup.java:2597) (android.view.View.java:10380) android.viewにあります。 ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597) android.view.View.getDisplayList(View.java:10380)android.view.HardwareRenderer $ GlRenderer.draw(HardwareRenderer.java:875)android.view.ViewRootImpl.performTraversalsでandroid.view.ViewRootImpl.draw(ViewRootImpl.java:1910) で で(ViewRootImpl.java:1634) android.os.Looper.loopでandroid.os.Handler.dispatchMessage(Handler.java:99) でandroid.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) (Looper.java:137) ででandroid.app.ActivityThread.main(ActivityThread.java:4575) at java.lang.reflect。Method.invokeNative(ネイティブメソッド) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786) at comから返さ

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

Cursor:dalvik.system.NativeStart.main(ネイティブメソッド)

私のコードで.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) fetchAllAssignments()は、CursorAdapterListViewを入力するために使用されます。 ListViewListFragmentのコンテンツで、このListFragmentのインスタンスは、ViewPagerの各ページに複数表示されています(1つはすべてのコースの割り当てを示し、次に1つは各コースのページを表示します)。

何が問題なのですか?私の知る限り、私はデータベースを正しく閉じています。より多くのコードが必要な場合はお知らせください。前もって感謝します!

EDIT:データはデータベースからプルされ、ListViewにも入力されます。私は様々なページをスワイプできますが、フラグメントが停止するとクラッシュするようです。別のアクティビティを開始したときにクラッシュすることはよくありますが、必ずしもそうではありません。ごくまれに、ページをスワイプしているときに時折クラッシュすることもあります。 onResume()私は、データベースからリストをリロード私は

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

をとの新しいコピーを入手:ここに私のonPause()メソッドは、(I)は、(onStop()、またはonDestroyを持っていない)私のフラグメントのためですコンテキスト:getActivity()多分何かがクリアされて(メモリの目的のために)、私はそれをリロードしていないでしょうか?私はNullPointerExceptionを一切取得していないので、これは私にとってはそう思わないでしょう...

答えて

3

データベースを二重に閉じるため、この例外は実際に発生しています。閉じなかったためではありません。

はそう..あなたで

close()方法は、あなたのコードに次の行を置き換えます。

if (db != null) { 

で:

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

ええ、それは間違いなくすべての答えを最もよく理解しています。私はそれをすることは決して考えなかった。 :) – mightimaus

+0

おかげで@ EverythingTech96、これはあなたの問題を解決した場合は、私に教えてください。 – kdehairy

2

DbHelperthis postに記載されているようにシングルトンにしてください。

+0

私が助けたと思います。時折クラッシュすることもありますが、私はずっと少ないと思います。とにかく良いアドバイス、ありがとう! :)他のアイデア? – mightimaus

+0

'DbHelper'をシングルトンにした場合、それを閉じる必要はありません。 –

+0

'SQLiteDatabase'(' db')を閉じる必要がありますか? – mightimaus

関連する問題