12

私には同期の確かな背景がありません。同期方式を使用すると、この問題は修正されると思います。しかし、誰かが私がこの問題を修正するのを手伝ってくれるでしょうか?コードは以下のとおりです。

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)
4

2 に答える 2

34

Dianne Hackborn (Androidフレームワークエンジニア)によると、コンテンツプロバイダーのデータベースを閉じる必要はありません。

コンテンツプロバイダーは、ホスティングプロセスが作成されたときに作成され、プロセスが作成されている間は存続するため、データベースを閉じる必要はありません。データベースを閉じる必要はありません。カーネルの一部として、プロセスが殺された。

したがって、データベースを閉じる必要はありません。不要な場合は自動的に閉じます。

于 2014-08-19T08:41:15.383 に答える
20

次の呼び出しで再び使用されるため、DBを閉じないでください。だから削除してみてください

db.close();

あなたのコードから。

于 2012-12-22T11:05:50.017 に答える