2012-12-22 21 views
7

मेरे पास सिंक्रनाइज़ेशन की कोई ठोस पृष्ठभूमि नहीं है। मुझे लगता है कि जब मैं सिंक्रनाइज़ विधि का उपयोग करता हूं तो यह समस्या ठीक हो जाएगी। लेकिन क्या कोई इस मुद्दे को ठीक करने में मेरी मदद कर सकता है? कोड के नीचे है:एंड्रॉइड SQLite बंद अपवाद

public HashMap<String, FriendInfo> getAllRecordsInList_HashMap() { 

     MySQLiteHelper dbHelper = MySQLiteHelper.getInstance(mActivity); 
     HashMap<String, FriendInfo> list_map = new HashMap<String, FriendInfo>(); 

     SQLiteDatabase db = dbHelper.getReadableDatabase(); 
     // Cursor cursor = db.rawQuery("SELECT * from " + 
     // dbHelper.tbl_friendlist, new String[] {}); 
     String[] cols = { dbHelper.id, dbHelper.name, dbHelper.picture, dbHelper.birthday, dbHelper.livein, dbHelper.gender, dbHelper.is_online, dbHelper.is_vip }; 
     Cursor cursor = db.query(dbHelper.tbl_friendlist, cols, null, null, null, null, dbHelper.name); 

     if (cursor != null && cursor.getCount() > 0) { 

      // some code here.... 
     } 
     cursor.close(); 
     return list_map; 
    } 

अलग धागे इस विधि getAllRecordsInList_HashMap() कॉल कर सकते हैं। यदि मैं सिंक्रनाइज़ विधि बना देता हूं तो कृपया इस समस्या को ठीक करने का सुझाव दें। क्या यह तय किया जाएगा?

java.lang.IllegalStateException: Cannot perform this operation 
    because the connection pool has been closed. 

at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962) 
at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599) 
at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348) 
at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894) 
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834) 
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62) 
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143) 
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) 
at com.platinumapps.friendlist.BLL_Friendlist.getAllRecordsInList_HashMap(BLL_Friendlist.java:290) 
at com.platinumapps.activities.Messages_Activity.addViewTOLayout(Messages_Activity.java:753) 
at com.platinumapps.activities.Messages_Activity.access$3(Messages_Activity.java:744) 
at com.platinumapps.activities.Messages_Activity$1$3.run(Messages_Activity.java:141) 
at ndroid.app.Activity.runOnUiThread(Activity.java:4644) 
at com.platinumapps.activities.Messages_Activity$1.onReceive(Messages_Activity.java:136) 
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:758) 
at android.os.Handler.handleCallback(Handler.java:725) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5039) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
at dalvik.system.NativeStart.main(Native Method) 

उत्तर

23
Dianne Hackborn (एंड्रॉयड ढांचे इंजीनियर) एक सामग्री प्रदाता

जब इसकी होस्टिंग प्रक्रिया, बनाया और जब तक के लिए चारों ओर रहता है एक सामग्री प्रदाता बनाई गई है में डेटाबेस बंद करने के लिए कोई जरूरत नहीं है के अनुसार

प्रक्रिया करता है, इसलिए प्रक्रिया को मारने पर प्रक्रिया के संसाधनों की सफाई करने वाले कर्नेल के हिस्से के रूप में डेटाबेस बंद करने की कोई आवश्यकता नहीं है।

इसलिए डेटाबेस डेटाबेस की कोई आवश्यकता नहीं है। जब इसकी आवश्यकता नहीं होती है तो यह स्वचालित रूप से बंद हो जाएगी।

+0

क्या होगा यदि मैं सामग्री प्रदाता का हिस्सा नहीं हूं? – zundi

+2

यदि आप ContentProvider का उपयोग नहीं कर रहे हैं, तो सिंगलटन पैटर्न SqlHandlerClass का उपयोग करके बेहतर है जिसमें एक समय में केवल एक ही इंस्टेंस हो सकता है। – Nepster

18

आपको डीबी बंद नहीं करना चाहिए क्योंकि इसे अगली कॉल में फिर से उपयोग किया जाएगा। तो

db.close(); 

को अपने कोड से हटाने का प्रयास करें।

+0

या यह चाल चलाना चाहिए। –