Android SQLite SQLiteOpenHelper IllegalStateException - DB Schon Geschlossen Fehler
Diese wurde driving me crazy nun seit ein paar Tagen. Ich habe ein android-Anwendung, die ist ziemlich Komplex. Es verwendet mehrere threads, um ziehen Sie die Daten von einem server, und füllen Sie die SQLite-Datenbank. Ich bin mit einer singleton-Referenz meine Erweiterung von SQLiteOpenHelper. Ich bin öffnen und schließen der Datenbank in jede meiner Aktivitäten.
Der Fehler tritt NUR in einer situation, als ich bin 4 Aktivitäten tief und dann versuchen, wieder aus. Ich habe versucht, verschiedene Möglichkeiten, öffnen und schließen der Datenbank, einschließlich verschieben der Nähe von der onDestroy (), onPause () - Methoden und auch das hinzufügen eines weiteren öffnen der onResume().
Auch der Hinweis, meine Tätigkeiten machen starken Gebrauch von ListViews und ExpandableListViews, die ich verstehen könnte die Datenbank zu schließen, basierend auf diesem Artikel: http://darutk-oboegaki.blogspot.com/2011/03/sqlitedatabase-is-closed-automatically.html
Ich habe mich durch den code, und ich bin entweder schließen alle meine Cursor, oder, wenn Sie zugewiesen wird, einen adapter, ruft startManagingCursor().
Hat jemand eine Ahnung, was Los ist???
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
UPDATE: ich habe das problem behoben, aber nicht wissen, WARUM diese Feste. Also, vielleicht hat jemand da draußen weiß oder erklären könnte.
Wenn ich in der 4. Aktivität der Stapel von Aktivitäten, die ich versuchte zu schließen, die db über die db.schließen(). Egal WO ich diese in der onCreate-nachdem ich die Daten die ich brauche, oder in der onStop oder onDestroy, wird dieser Fehler erzeugt. Wenn ich NICHT in der Nähe der db, ich bin nicht mit dem problem. Also, etwas was die db automatisch geschlossen werden. Das merkwürdige ist, obwohl ich mit einer expandableListView in dieser letzten Aktivität, ich bin NICHT mit einem cursorAdapter. Jemand irgendwelche Gedanken? Würde lieben, Sie zu verstehen.
InformationsquelleAutor SBerg413 | 2011-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da diese Frage bekommen viel Aufmerksamkeit, ich wollte, Sie zu beantworten und zu beschreiben, was ich gelernt habe und was für mich gearbeitet, dieses problem zu korrigieren in meinen großen, Datenbank-gefahrene Anwendung:
Verwenden Sie NICHT verwaltete Cursor. Es gibt einen Grund, warum Sie sind veraltet. Sie sind absolut problematisch. Realistisch gesehen, gibt es nur sehr wenige Szenarien, in denen Sie wirklich brauchen, verwenden Sie eine verwaltete cursor sowieso. Stattdessen führen Sie Ihre Anfrage und füllen Sie ein Objekt mit den Ergebnissen. Wenn Sie Abfragen für mehrere Zeile, erstellen eine ArrayList<> von Ihrem Objekt, halten alle Zeilen. Was ich jetzt mache ist eine Funktion erstellen, führt die Abfrage aus und übergibt mir wieder meine ArrayList<> anstatt einen cursor zurück. Ich schließe den cursor in die Funktion und ich bin fertig. Für eine ListViews, Sie werden nicht mehr in der Lage, einen SimpleCursorAdapter. Einfach konvertieren alle diese zu einem BaseAdapter und verwenden Sie Ihre ArrayList<> Objekt mit Daten füllen.
VERGESSEN SIE NICHT, SCHLIEßEN SIE ALLE CURSOR. Dies kann auch verheerend auf Ihre app db-verbindungen. Ich dachte, ich Tue das aber, das ist sicher genug, fanden eine Stelle, die ich nicht explizit schließen Sie einen cursor. Also, gehen Sie durch Ihre app und überprüfen Sie alle von Ihnen.
Ich bin auch mit einer singleton-DatabaseHelper Objekt. Ich deklarieren Sie eine statische DatabaseHelper Objekt innerhalb meiner SQLiteOpenHelper Klasse, so dass ich bin immer die gleiche Instanz zu jeder Zeit.
Nun habe ich eine stabil laufende app, die nicht mehr bekommt diese DB-Fehler. Ich hoffe, diese Informationen sind hilfreich für einige von Euch.
InformationsquelleAutor SBerg413
CursorAdapter verwenden.changeCursor(null) ,Kann die Geschwindigkeit der Entstehung dieses Fehlers,kann Aber nicht vollständig lösen das problom ,Unbekannte Zeit wird wieder angezeigt.
Diese wurde driving me crazy auch!
InformationsquelleAutor Julien
Ich hatte auch das gleiche problem 'db schon geschlossen Ausnahme mit dem cursor ungültige Anweisung in fillWindow() und IllegalStatementException'. Was ich Tat, war, legte ich meinen cursor (B/c kommt auch aus SimpleCursorAdapter) auf eine Instanz-variable statt der Methode ist die variable dann auf meine onStop und Methoden onPause ich nenne stopManagingCursor dann auf meine onResume und Methoden onStart ich nenne startManagingCursor.
Es löste mein problem für mich und ich fand keine Fehler-oder Warnmeldungen in meinem logcat nach 🙂 Hoffe, dies hilft jemand auch.
InformationsquelleAutor gilsaints88