Android : Невозможно выполнить эту операцию, потому чтобассейн соединение было закрыто

? Ferran Negre @ | Original: StackOverFlow
---

Я читал через StackOverflow об этом вопросе, и я до сих пор не нашел решения . Я замечаю, что иногда, мое приложение выдает эту ошибку :

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

У меня есть файл с именем DatabaseHelper.java используя этот подход, чтобы получить экземпляр этого :

public static DatabaseHelper getInstance(Context context) {
    if (mInstance == null) {
        mInstance = new DatabaseHelper(context.getApplicationContext());
    }
    return mInstance;
}

Тогда я такие методы, как этот ( что он разбился в строке cursor.moveToFirst ( ) с этой ошибки ) . Это почти никогда не падает, но иногда он делает.

public Profile getProfile(long id) {
    SQLiteDatabase db = this.getReadableDatabase();

    String selectQuery = "SELECT * FROM " + TABLE_PROFILES + " WHERE " + KEY_PROFILES_ID + " = " + id;
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    Profile profile = new Profile();
    if (cursor.moveToFirst()) {
        doWhatEver();
    }
    cursor.close();
    db.close();

    return profile;
}

Так вот оно что, во всех методах, которые я использую :

SQLiteDatabase db = this.getReadableDatabase(); (or Writable)

И тогда я закрываю курсор и БД. В этом случае ,ошибка вышла выбросить в линейке:

cursor.moveToFirst();

Я не понимаю, почемуошибка говоритдБ закрыт, если я звоню this.getReadableDatabase () перед . Пожалуйста, поддержите ! Спасибо :)

---

Top 5 ответ

1AmmarCSE @

Try removing

db.close();

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

Http://developer.android.com/reference/android/database/sqlite/SQLiteClosable.html#close%28%29 говорит:

Релизы ссылку на объект, закрывая объект ...

Кроме того, проверьте  http://stackoverflow.com/questions/14002022/android-sq-lite-closed-exception

2Mark @

Я имею ту же проблему, не смогли это исправить. Я нашел Возможный ключ : У меня есть поток синхронизации, который работает все время :

    Item ii = dbHelper.popPendingUpload();
    if (ii != null)
            upload(ii);

А внутри DBHelper

public Item popPendingUpload() {

    SQLiteDatabase db = getReadableDatabase();
    Cursor res = db
            .rawQuery("SELECT * FROM items WHERE state = 0 LIMIT 1",
                    new String[] {});
    boolean hasNext = res.moveToFirst();
    Item ii = null;
    if (hasNext) {
        ii = //load item
    }
    db.close();
    return ii;
}

Ошибка также появляется в способе moveToFirst ( ) вызова. Какнить внезапная элементы в бесконечном цикле ,первый раз он работает нормально,второй раз появляетсяошибка . Интересно то, что если я ставлю точку останова и шаг через код ,ошибка не показать больше. Я проверяю на реальном устройстве с помощью Android 4.1.

Я знаю, неответ, но это может помочь. Я буду продолжать тестирование.