Закрытое исключение 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)

Ответ 1

В соответствии с Dianne Hackborn (Android-каркасный инженер) нет необходимости закрывать базу данных в поставщике контента

Поставщик контента создается, когда его хостинг-процесс создается, и остается вокруг до тех пор, пока процесс выполняется, поэтому нет необходимости закрывать базу данных, она будет закрыта, поскольку часть ядра очистит ресурсы процесса, когда процесс будет убит.

Таким образом, нет необходимости в закрывать базу данных. он будет автоматически закрываться, когда он не понадобится.

Ответ 2

Вы не должны закрывать БД, так как он будет использоваться снова в следующем вызове. Поэтому попробуйте удалить

db.close();

из вашего кода.