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) atroid.database.sqlite पर। SQLiteDatabase.lock (SQLiteDatabase.java:400) atroid.database.sqlite.SQLiteQuery.fillWindow (SQLiteQuery.java:79) android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:164) पर और roid.database.sqlite.SQLiteCursor.onMove (SQLiteCursor.java:147) android.database.AbstractCursor.moveToPosition (AbstractCursor.java:178) atroid.support.v4.widget.CursorAdapter.getItemId (CursorAdapter.java: 225) android.widget.AbsListView.onSaveInstanceState (AbsListView.java:1569) android.view.View.dispatchSaveInstanceState (View.java:9868) पर android.view.ViewGroup.dispatchFreezeSelfOnly पर पर (ViewGroup.java:2310) android.widget.AdapterView.dispatchSaveInstanceState (AdapterView.java:770) android.view.ViewGroup.dispatchSaveInstanceState (ViewGroup.java:2296) पर android.view.View.saveHierarchyState पर (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) एंड्रॉयड पर पर। support.v4.app.BackStackRecord.run (BackStackRecord.java:620) android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1431) atroid.support.v4.app.FragmentManagerImpl.executePendingTransactions (FragmentManager.java:431) एंड्रॉइड.support.v4.app.FragmentPagerAdapter.finishUpdate (FragmentPagerAdapter.java:141) एंड्रॉइड.support.v4.view.ViewPager.populate (ViewPager.java:895) एंड्रॉइड पर। support.v4.view.ViewPager.populate (ViewPager.java:772) atroid.support.v4.vi पर ew.ViewPager.completeScroll (ViewPager.java:1539) atroid.support.v4.view.ViewPager.computeScroll (ViewPager.java:1422) atroid.view.View.getDisplayList (View.java:10406) पर android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java39597) एंड्रॉइड.view.View.getDisplayList (View.java:10380) atroid.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java39597) एंड्रॉइड पर। देखें.View.getDisplayList (View.java:10380) atroid.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java39597) एंड्रॉइड.view.View.getDisplayList (View.java:10380) atroid.view पर। ViewGroup.dispatchGetDisplayList (ViewGroup.java39597) atroid.view.View.getDisplayList (View.java:10380)android.view.HardwareRenderer $ GlRenderer.draw (HardwareRenderer.java:875) android.view.ViewRootImpl.draw (ViewRootImpl.java:1910) android.view.ViewRootImpl.performTraversals पर पर पर(ViewRootImpl.java:1634) android.view.ViewRootImpl.handleMessage (ViewRootImpl.java:2442) android.os.Handler.dispatchMessage (Handler.java:99) पर android.os.Looper.loop पर (Looper.java:137) पर पर android.app.ActivityThread.main (ActivityThread.java:4575) java.lang.reflect पर।Method.invokeNative (मूल विधि) java.lang.reflect.Method.invoke (method.java:5211) com.android.internal.os.ZygoteInit $ methodAndArgsCaller.run (ZygoteInit.java:786) कॉम पर .android.internal.os.ZygoteInit.main (ZygoteInit.java:553) dalvik.system.NativeStart.main पर (मूल निवासी विधि)

मेरे कोड:

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 से लौटे fetchAllAssignments() का उपयोग ListView को कस्टम CursorAdapter के माध्यम से पॉप्युलेट करने के लिए किया जाता है। ListViewListFragment की सामग्री है, और ViewPager के प्रत्येक पृष्ठ में प्रदर्शित इस सूची प्रारूप के कई उदाहरण हैं (सभी पाठ्यक्रमों से असाइनमेंट दिखाने के लिए, और फिर प्रत्येक व्यक्तिगत पाठ्यक्रम के लिए एक पृष्ठ)।

क्या गलत है इसके बारे में कोई विचार? जहां तक ​​मुझे पता है, मैं अपना डेटाबेस सही ढंग से बंद कर रहा हूं। अगर आपको अधिक कोड चाहिए तो मुझे बताएं। अग्रिम में धन्यवाद!

संपादित करें: डेटा डेटाबेस से ठीक से खींचा जाता है, और यह ListView को भी पॉप्युलेट करता है। मैं विभिन्न पृष्ठों के माध्यम से स्वाइप कर सकता हूं, लेकिन जब भी फ्रैगमेंट बंद हो जाता है तो यह दुर्घटनाग्रस्त प्रतीत होता है। जब मैं एक और गतिविधि शुरू करता हूं, लेकिन हमेशा नहीं होता तो यह अक्सर दुर्घटनाग्रस्त हो जाता है। जब भी मैं पृष्ठों के माध्यम से स्वाइप कर रहा हूं, यह शायद ही कभी दुर्घटनाग्रस्त हो जाएगा, हालांकि बहुत ही कम है। यहाँ मेरी टुकड़ा के लिए मेरे onPause() विधि है (मैं एक onStop() या OnDestroy() की जरूरत नहीं है):

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

मेरी onResume() मैं सिर्फ डेटाबेस से सूची पुन: लोड और की एक नई प्रतिलिपि प्राप्त getActivity() के माध्यम से संदर्भ। शायद कुछ साफ़ हो रहा है (स्मृति उद्देश्यों के लिए) और मैं इसे पुनः लोड नहीं कर रहा हूं? मुझे किसी भी तरह की NullPointerException नहीं मिल रहा है, इसलिए यह मेरे लिए असंभव प्रतीत होता है ...

उत्तर

3

यह अपवाद वास्तव में उठाया गया है क्योंकि आप अपना डेटाबेस बंद कर देते हैं, न कि क्योंकि आपने इसे बंद नहीं किया है।

तो ..

आप में

close() विधि, निम्न पंक्ति अपने कोड में बदल देते हैं:

if (db != null) { 

साथ:

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

हाँ, यह निश्चित रूप से सभी उत्तरों का सबसे अधिक अर्थ बनाता है। मैंने ऐसा कभी नहीं सोचा था। :) – mightimaus

+0

धन्यवाद @ EverythingTech96, अगर यह आपकी समस्या हल करता है, तो मुझे बताएं। – kdehairy

2

this post में वर्णित अनुसार DbHelper एक सिंगलटन बनाएं।

+0

मुझे लगता है कि मदद की। यह अभी भी कभी-कभी दुर्घटनाग्रस्त हो जाता है, लेकिन मुझे लगता है कि बहुत कम है। वैसे भी अच्छी सलाह, धन्यवाद! :) कोई अन्य विचार? – mightimaus

+0

यदि आपने अपना 'डीबीहेल्पर' सिंगलटन बनाया है, तो आपको इसे बंद नहीं करना चाहिए। –

+0

क्या मुझे अपना 'SQLiteDatabase' ('db') बंद करने की आवश्यकता है? – mightimaus

संबंधित मुद्दे