데이터베이스 어댑터를 올바르게 닫고 있는지 확인 했으므로이 오류의 원인이 무엇인지 잘 모릅니다.IllegalStateException : 데이터베이스가 이미 닫혔습니다 (ViewPager 사용)
치명적인 예외 : 주요 java.lang.IllegalStateException : 데이터베이스 /data/data/com.acedit.assignamo/databases/data.db (여기에 로그 캣의 말 (그들 모두에 대한 태그가 AndroidRuntime입니다) 무엇 conn # 0)은 이미 android.database.sqlite.SQLiteDatabase.verifyDbIsOpen (SQLiteDatabase.java:2082)에서 을 닫았습니다. android.database.sqlite.SQLiteDatabase.lock (SQLiteDatabase.java:413)에서 android.database.sqlite에 있습니다. SQLiteDatabase.lock (SQLiteDatabase.java:400) android.database.sqlite.SQLiteQuery.fillWindow (SQLiteQuery.java:79) android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:164) at 및 roid.database.sqlite.SQLiteCursor.onMove (SQLiteCursor.java:147) android.database.AbstractCursor.moveToPosition (AbstractCursor.java:178) android.support.v4.widget.CursorAdapter.getItemId (CursorAdapter.java : android.view.ViewGroup.dispatchFreezeSelfOnly에서 android.view.View.dispatchSaveInstanceState (View.java:9868) 에서 android.widget.AbsListView.onSaveInstanceState (AbsListView.java:1569) 225) (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 android.support.v4.app.FragmentManagerImpl.detachFragment (FragmentManager.java:1233) 로이드에서 에서 android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:962) 에서 ntManager.java:1561) . support.v4.app.BackStackRecord.run (BackStackRecord.java:620) android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1431) android.support.v4.app.FragmentManagerImpl.executePendingTransactions (FragmentManager.java:431) android.support.v4.app.FragmentPagerAdapter.finishUpdate (FragmentPagerAdapter.java:141) at android.support.v4.view.ViewPager.populate (ViewPager.java:895) at 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.View.View.GetDisplayList (ViewGroup.java:2597) (android.view.View.View.java:10380)에서 android.view.View.View.GetDisplayList (ViewGroup.java:2597)에서 android에서 볼 수 있습니다. view.View.getDisplayList (View.java:10380) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:2597)에서 android.view.View.getDisplayList (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.COM에서 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:786) 에서 java.lang.reflect.Method.invoke (Method.java:511) 에서 Method.invokeNative (기본 방법) dalvik.system.NativeStart.main에서 .android.internal.os.ZygoteInit.main (ZygoteInit.java:553) (기본 방법)
내 코드 : Cursor
가에서 반환
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.");
}
fetchAllAssignments()
은 CursorAdapter
을 통해 ListView
을 채우는 데 사용됩니다. ListView
은 ListFragment
의 콘텐츠이며,이 ListFragment의 인스턴스가 ViewPager의 각 페이지에 여러 개 표시됩니다 (하나는 모든 코스의 과제를 보여준 다음 개별 코스의 페이지를 표시하기위한 것입니다).
무엇이 잘못 되었습니까? 내가 아는 한, 나는 데이터베이스를 올바르게 닫고있다. 더 많은 코드가 필요한 경우 알려 주시기 바랍니다. 미리 감사드립니다!
EDIT : 데이터는 데이터베이스에서 정상적으로 가져오고 ListView도 채 웁니다. 여러 페이지를 스 와이프 할 수 있지만 조각이 중지 될 때마다 충돌하는 것 같습니다. 다른 활동을 시작할 때 충돌이 자주 발생하지만 항상 그런 것은 아닙니다. 아주 드문 경우이긴하지만 페이지를 스 와이프 할 때 때때로 충돌이 발생합니다. onResume()
난 그냥 데이터베이스에서 목록을 다시로드 내에서
public void onPause() {
super.onPause();
if (!assignmentsCursor.isClosed()) {
assignmentsCursor.close();
assignmentsCursor = null;
}
}
과의 새 복사본을 얻을 : 여기 내 onPause() 메소드는 (내가) (AN 이동 중지() 또는들의 OnDestroy이없는) 내 조각을 위해이다 컨텍스트 : getActivity()
. 아마도 뭔가 (메모리 목적을 위해) 지워지고 나는 그것을 다시로드하지 않을거야? 어떤 종류의 NullPointerException도 발생하지 않으므로 .........................
그래, 모든 답변을 확실히 이해할 수 있습니다. 나는 결코 그렇게 생각하지 않았다. :) – mightimaus
감사합니다. @ EverythingTech96, 이것이 문제를 해결하면 알려주세요. – kdehairy