Android: Não é possível realizar esta operação porque o pool de conexão foi fechada

? Ferran Negre @ | Original: StackOverFlow
---

Eu estava lendo através stackoverflow sobre esta questão e eu ainda não encontrei uma solução. Percebo que, às vezes, meu aplicativo lança este erro:

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

Eu tenho um arquivo chamado DatabaseHelper.java usar essa abordagem para obter uma instância dele :

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

Então eu tenho métodos como este ( que caiu na linha cursor.moveToFirst () com este erro). Ele quase nunca falha, mas às vezes ele faz.

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

Então é isso, em todos os métodos que eu uso :

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

E então eu fechar o cursor e db. Neste caso, o erro foi jogar na linha :

cursor.moveToFirst();

Eu não vejo por que o erro diz o db é fechado se eu estou chamando this.getReadableDatabase () antes . Por favor, apoiem ! Obrigado :)

---

Top 5 Responder

1AmmarCSE @

Try removing

db.close();

Se você tentar outra operação depois de fechar o banco de dados, ele vai te dar essa exceção .

O http://developer.android.com/reference/android/database/sqlite/SQLiteClosable.html#close%28%29 diz:

Releases uma referência ao objeto, fechar o objeto ...

Além disso, confira  http://stackoverflow.com/questions/14002022/android-sq-lite-closed-exception

2Mark @

Estou tendo o mesmo problema, não têm sido capazes de corrigi-lo. Eu encontrei uma possível pista : Eu tenho um fio de sincronização que está em execução o tempo todo:

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

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

O erro também aparece no moveToFirst () chamada de método . Como o fio é poping artigos para fora em um loop infinito, pela primeira vez ele funciona ok, a segunda vez que aparece o erro. A parte interessante é que se eu colocar um ponto de interrupção e passo através do código, o erro não aparecer mais. Estou testando em um dispositivo real usando o Android 4.1.

Eu sei, não é uma resposta, mas pode ajudar . Vou continuar os testes.