2012-12-22 10 views
7

Ich habe keinen festen Hintergrund der Synchronisation. Ich denke, dieses Problem wird behoben, wenn ich synchronisierte Methode verwende. Aber kann mir jemand helfen, dieses Problem zu beheben? Code ist unter:Android SQLite geschlossen Ausnahme

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; 
    } 

Verschiedene Threads können diese Methode getAllRecordsInList_HashMap() aufrufen. Bitte geben Sie an, wie Sie dieses Problem beheben können, wenn ich eine synchronisierte Methode anlege. Wird es repariert werden?

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) 

Antwort

23

Nach Dianne Hackborn (Android Framework Ingenieure) besteht keine Notwendigkeit, die Datenbank in einem Content-Provider

Ein Content-Provider erstellt wird, wenn sein Hosting-Prozess erstellt wird, und bleibt um so lange zu schließen, wie der Prozess tut dies, so dass es nicht notwendig ist, die Datenbank zu schließen, die als Teil des Kernels geschlossen wird, um die Ressourcen des Prozesses zu bereinigen, wenn der Prozess beendet wird.

So gibt es keine Notwendigkeit, schließen der Datenbank. Es wird automatisch geschlossen, wenn es nicht benötigt wird.

+0

Was ist, wenn ich nicht Teil eines Content Providers bin? – zundi

+2

Wenn Sie nicht ContentProvider verwenden, verwenden Sie besser eine Singleton Pattern SqlHandlerClass, die jeweils nur eine Instanz haben kann. – Nepster

18

Sie sollten die DB nicht schließen, da sie beim nächsten Aufruf wieder verwendet wird. Versuchen Sie also, die

aus Ihrem Code zu entfernen.

+0

ya sollte es den Trick tun. –

Verwandte Themen