Android : Impossibile eseguire questa operazione perché il pool di connessione è stata chiusa

? Ferran Negre @ | Original: StackOverFlow
---

Stavo leggendo attraverso StackOverflow a questa domanda e non ho ancora trovato una soluzione . Ho notato che a volte, la mia app genera questo errore :

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

Ho un file chiamato DatabaseHelper.java utilizzando questo approccio per ottenere un'istanza di esso :

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

Poi ho metodi come questo ( che si è schiantato nella linea cursor.moveToFirst () con tale errore ) . E quasi mai va in crash, ma a volte lo fa .

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

Così il gioco è fatto, in tutti i metodi che uso :

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

E allora chiudo il cursore e il db . In questo caso, l'errore ottenuto gettare in linea :

cursor.moveToFirst();

Non vedo il motivo per cui l' errore dice il db è chiuso se io chiamo this.getReadableDatabase ( ) prima . Si prega di sostenere ! Grazie :)

---

Top 5 Risposta

1AmmarCSE @

Try removing

db.close();

Se si tenta un'altra operazione dopo aver chiuso il database, che vi darà questa eccezione .

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

Uscite un riferimento all'oggetto, chiudendo l'oggetto ...

Inoltre, il check out  http://stackoverflow.com/questions/14002022/android-sq-lite-closed-exception

2Mark @

Sto avendo lo stesso problema, non sono stati in grado di risolvere il problema . Ho trovato un possibile indizio : Ho un filo di sincronizzazione che esegue tutto il tempo :

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

L'errore si mostra anche nel metodo moveToFirst ( ) chiamata . Poiché il filo è poping articoli fuori in un ciclo infinito, appare l'errore la seconda volta la prima volta funziona bene . La parte interessante è che se metto un punto di interruzione e passo attraverso il codice, l'errore non mostra più . Sto testando su un dispositivo reale utilizzando Android 4.1 .

Lo so, non è una risposta, ma può aiutare . Io continuo a test .