Android la base de données Ne peut pas effectuer cette opération, car le pool de connexion a été fermée
J'ai un problème étrange avec android de base de données et les curseurs. De temps en temps (très rarement) se produit, que j'ai eu rapport de crash de clients. Il est difficile de savoir pourquoi il se bloque, comme je l'ai ~ 150 000 utilisateurs actifs et peut-être 1 rapport par semaine, donc c'est vraiment un bug mineur. Voici exception:
STACK_TRACE=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:144)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
at sk.mildev84.agendareminder.a.c.a(SourceFile:169)
Avant chaque curseur "de retravailler et d'exploration de" j'utilise ce code pour s'assurer que tout est ok:
db = instance.getWritableDatabase();
cursor = db.rawQuery(selectQuery, null);
if (isCursorEmptyOrNotPrepared(cursor)) {
...
}
private synchronized boolean isCursorEmptyOrNotPrepared(Cursor cursor) {
if (cursor == null)
return true;
if (cursor.isClosed())
return true;
if (cursor.getCount() == 0) //HERE IT CRASHES
return true;
return false;
}
Et il tombe à la ligne:
if (cursor.getCount() == 0)
Ce que quelqu'un sait pourquoi? Je pense, je suis la vérification de toutes les exceptions possibles et les conditions...Pourquoi mon application crash ici?
PS: Toutes les méthodes de base de données sont synchronisées et je suis bien d'ouverture et de fermeture de la base de données/curseurs dans tous les cas, je l'ai vérifié de nombreuses fois.
mise à jour de question.
Il n'est pas nécessaire de fermer la db. Android le gérer. Lisez cet Excellent explication ici...stackoverflow.com/questions/14002022/...
Je me demande si cela ne s'applique qu'aux Fournisseurs de Contenu
S'il vous plaît comment avez-vous réussi à résoudre cette erreur? veuillez me faire savoir si @GuriBhai solution owrked pour vous. Je vais avoir le même message d'erreur mais la fermeture de la db n'a pas résolu mon problème.
OriginalL'auteur qkx | 2014-04-30
Vous devez vous connecter pour publier un commentaire.
Problème
Si vous essayez d'effectuer une autre opération après la fermeture de la base de données, il vous donnera l'exception.Parce que
db.close();
libère une référence à l'objet, la fermeture de l'objet si la dernière référence a été publié.Solution
Garder un seul
SQLiteOpenHelper
instance(Singleton
) dans un contexte statique. Faire l'initialisation tardive, etsynchronize
cette méthode. CommeEt vous n'avez pas à le fermer? Lorsque l'application s'arrête, il va lâcher le fichier de référence, si même sa tenue à elle.
c'est à dire que Vous ne devez pas fermer la DB car il sera utilisé de nouveau dans le prochain appel.
Il suffit donc de retirer
Pour plus d'info Voir à Unique connexion SQLite
OriginalL'auteur Giru Bhai
Vous venez de supprimer
Supprimer db.close()
OriginalL'auteur
J'ai eu ce problème aussi. mon SQLiteOpenHelper classe a été Singleton ainsi que la fermeture de la db après chaque opération CRUD.
Une fois que j'ai mes méthodes(CRUD) synchronisée dans mon SQLiteOpenHelper classe, je n'ai pas d'erreur plus 🙂
OriginalL'auteur Sherry
Même problème s'est produit pour moi, donc après la lecture de explication j'ai enlevé
db.close();
de
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
et
public int delete(Uri uri, String selection, String[] selectionArgs)
méthode de ContentProvider
Pas besoin de db.close() comme ContentProvider lui-même prendre soin de la fermeture de la base de données.
OriginalL'auteur Lokesh Tiwari
Le problème est clair que
Pour éviter IllegalStateException, nous pouvons garder la base de données ouverte tout le temps, si cela est approprié. Dans d'autres situations, nous devons vérifier l'état avant d'essayer getCount.
Mon expérience est la suivante:
Défectueux Code:
Parfait Code:
OriginalL'auteur Verdigrass