2012-12-22 66 views
7

我沒有固定的同步背景。我認爲這個問題將在我使用同步方法時得到解決。但任何人都可以幫助我解決這個問題?代碼如下:Android 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(Android框架工程師)沒有必要關閉數據庫在內容提供商

在創建它的宿主進程, 並保持周圍,只要創建一個內容提供商這個過程的確如此,所以不需要關閉數據庫,它會在內核的一部分被關閉,從而在進程被終止時清理進程的資源。

所以沒有必要關閉數據庫。它會在不需要時自動關閉。

+0

如果我不是內容提供者的一員,該怎麼辦? – zundi

+2

如果您不使用ContentProvider,那麼最好使用Singleton Pattern SqlHandlerClass,它一次只能有一個實例。 – Nepster

18

您不應關閉數據庫,因爲它將在下次調用中再次使用。因此,請嘗試從代碼中刪除

db.close(); 

+0

雅它應該做的伎倆。 –