Android SQLite SQLiteOpenHelper IllegalStateException - DB Déjà Fermé d'Erreur
Cela a été me rend fou depuis quelques jours maintenant. J'ai une application android qui est assez complexe. Il utilise plusieurs threads pour extraire des données à partir d'un serveur et de remplir la base de données SQLite. Je suis à l'aide d'un singleton pour référencer mon extension de SQLiteOpenHelper. Je suis de l'ouverture et de la fermeture de la base de données dans chacune de mes activités.
L'erreur ne se produit que dans une situation où je suis en 4 activités profonde et ensuite tenter de faire marche arrière. J'ai essayé différentes manières de l'ouverture et de la fermeture de la base de données, y compris le déplacement de la clôture de la onDestroy() à la onPause() les méthodes et l'ajout d'un autre ouvert à la onResume().
Également de noter mes activités en faire un usage intensif de ListViews et ExpandableListViews, que je comprends, cela pourrait entraîner la base de données à proximité basé sur cet article: http://darutk-oboegaki.blogspot.com/2011/03/sqlitedatabase-is-closed-automatically.html
Je suis passé par le code et fait en sorte que je suis en train de fermer tous mes curseurs, ou, s'ils sont affectés à un adaptateur, appelant startManagingCursor().
Quelqu'un indice quant à ce qu'il se passe?
java.lang.RuntimeException: Unable to resume activity {com.fieldone/com.fieldone.DispatchActivity}: java.lang.IllegalStateException: database /data/data/com.fieldone/databases/InterstateAirConditioning-1602814322.db already closed
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3347)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3362)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2162)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:144)
at android.app.ActivityThread.main(ActivityThread.java:4937)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: database /data/data/com.fieldone/databases/InterstateAirConditioning-1602814322.db already closed
at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:237)
at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:145)
at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:567)
at android.app.Activity.performRestart(Activity.java:3836)
at android.app.Activity.performResume(Activity.java:3857)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3337)
... 10 more
Mise à JOUR: j'ai résolu le problème, mais vous ne savez pas POURQUOI ce fixe. Alors, peut-être quelqu'un là-bas sait ou pourrait l'expliquer.
Quand je suis dans la 4ème activité de la pile d'activités, j'ai été de tenter de fermer la db db.close(). Peu importe OÙ j'ai mis ce, dans le onCreate après je obtenir les données dont j'ai besoin, ou dans le onStop ou onDestroy, il va produire cette erreur. Si je NE ferme PAS la db, je ne suis pas avoir le problème. Alors, quelque chose est à l'origine de la db pour fermer automatiquement. La chose étrange est que, même si je suis à l'aide d'un expandableListView dans cette dernière activité, je ne suis PAS à l'aide d'un cursorAdapter. Quelqu'un a des idées? Aimerait comprendre.
OriginalL'auteur SBerg413 | 2011-06-30
Vous devez vous connecter pour publier un commentaire.
Depuis que cette question a pris une bonne partie de son attention, j'ai voulu répondre et de décrire ce que j'ai appris et ce qui a fonctionné pour moi de corriger ce problème dans mon grand, sur base de données de l'application:
N'utilisez PAS réussi curseurs. Il ya une raison pourquoi ils sont obsolètes. Elles sont tout à fait problématique. De façon réaliste, il y a très peu de scénarios où vous avez réellement besoin d'un gérés curseur de toute façon. Au lieu de cela, l'exécution de votre requête et de remplir un objet avec les résultats. Si vous êtes à l'interrogation de plusieurs lignes, créer une ArrayList<> de votre objet pour contenir toutes les lignes. Ce que je fais maintenant est de créer une fonction qui exécute la requête et passe-moi mon ArrayList<> plutôt que d'un curseur dans le retour. Je ferme le curseur à l'intérieur de la fonction, et je suis fait. Pour un ListViews, vous n'aurez plus la possibilité d'utiliser un SimpleCursorAdapter. Il suffit de convertir l'ensemble de ces pour un BaseAdapter et l'utilisation de votre ArrayList<> objet de la peupler.
NE PAS OUBLIER DE FERMER TOUTES VOS CURSEURS. Cela peut aussi faire des ravages sur votre application db connections. Je pensais que je faisais cela, mais, bien sûr, trouvé un endroit que je n'étais pas explicitement la fermeture d'un curseur. Donc, allez dans votre application et vérifiez-les tous.
Je suis également utiliser un singleton DatabaseHelper objet. Je déclare statique DatabaseHelper objet dans mon SQLiteOpenHelper classe de sorte que je me fais de la même instance à chaque fois.
J'ai maintenant un stable de l'application en cours d'exécution, qui n'est plus reçoit de ces DB erreurs. J'espère que cette information est utile à certains d'entre vous.
OriginalL'auteur SBerg413
utilisation CursorAdapter.changeCursor(null) ,Peut ralentir l'apparition de ce bug,Mais ne peut pas résoudre complètement le problom ,Inconnu de la période de l'heure s'affiche de nouveau.
Cela a été me rend fou aussi!
OriginalL'auteur Julien