5

데이터베이스 어댑터를 올바르게 닫고 있는지 확인 했으므로이 오류의 원인이 무엇인지 잘 모릅니다.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을 채우는 데 사용됩니다. ListViewListFragment의 콘텐츠이며,이 ListFragment의 인스턴스가 ViewPager의 각 페이지에 여러 개 표시됩니다 (하나는 모든 코스의 과제를 보여준 다음 개별 코스의 페이지를 표시하기위한 것입니다).

무엇이 잘못 되었습니까? 내가 아는 한, 나는 데이터베이스를 올바르게 닫고있다. 더 많은 코드가 필요한 경우 알려 주시기 바랍니다. 미리 감사드립니다!

EDIT : 데이터는 데이터베이스에서 정상적으로 가져오고 ListView도 채 웁니다. 여러 페이지를 스 와이프 할 수 있지만 조각이 중지 될 때마다 충돌하는 것 같습니다. 다른 활동을 시작할 때 충돌이 자주 발생하지만 항상 그런 것은 아닙니다. 아주 드문 경우이긴하지만 페이지를 스 와이프 할 때 때때로 충돌이 발생합니다. onResume() 난 그냥 데이터베이스에서 목록을 다시로드 내에서

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

과의 새 복사본을 얻을 : 여기 내 onPause() 메소드는 (내가) (AN 이동 중지() 또는들의 OnDestroy이없는) 내 조각을 위해이다 컨텍스트 : getActivity(). 아마도 뭔가 (메모리 목적을 위해) 지워지고 나는 그것을 다시로드하지 않을거야? 어떤 종류의 NullPointerException도 발생하지 않으므로 .........................

답변

3

데이터베이스를 두 번 닫았 기 때문에이 예외가 실제로 발생합니다. 닫지 않았기 때문에가 아닙니다.

그래서 .. 당신의

close() 방법은 코드에서 다음 줄을 바꿉니다

if (db != null) { 

로 :

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

그래, 모든 답변을 확실히 이해할 수 있습니다. 나는 결코 그렇게 생각하지 않았다. :) – mightimaus

+0

감사합니다. @ EverythingTech96, 이것이 문제를 해결하면 알려주세요. – kdehairy

2

this post에 설명 된대로 DbHelper을 싱글 톤으로 설정하십시오.

+0

내가 도움이되었다고 생각합니다. 때때로 가끔 충돌하지만, 나는 훨씬 덜 생각합니다. 어쨌든 좋은 조언, 감사합니다! :) 다른 아이디어? – mightimaus

+0

'DbHelper'를 싱글 톤으로 만들었다면 그것을 닫을 필요가 없습니다. –

+0

'SQLiteDatabase' ('db')를 닫아야합니까? – mightimaus

관련 문제