这几天让我发疯了。我有一个非常复杂的 android 应用程序。它使用多个线程从服务器中提取数据并填充 SQLite 数据库。我正在使用单例来引用我的 SQLiteOpenHelper 扩展。我在每个活动中打开和关闭数据库。
该错误仅发生在我进行 4 次活动深度然后尝试退出的情况下。我尝试了各种打开和关闭数据库的方法,包括将关闭从 onDestroy() 移动到 onPause() 方法,以及向 onResume() 添加另一个打开。
另外值得注意的是,我的活动大量使用了 ListViews 和 ExpandableListViews,据我了解,这可能会导致数据库根据这篇文章关闭: http: //darutk-oboegaki.blogspot.com/2011/03/sqlitedatabase-is-closed-自动.html
我已经检查了代码并确保我要么关闭所有游标,要么,如果它们被分配给适配器,则调用 startManagingCursor()。
有人知道发生了什么吗?
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
更新: 我已经解决了这个问题,但不确定为什么要解决它。所以,也许有人知道或可以解释。
当我在活动堆栈的第 4 个活动中时,我试图通过 db.close() 关闭数据库。无论我把它放在哪里,在我得到我需要的数据之后的 onCreate 中,或者在 onStop 或 onDestroy 中,它都会产生这个错误。如果我不关闭数据库,我就没有问题。因此,某些原因导致数据库自动关闭。奇怪的是,虽然我在最后的活动中使用了可扩展列表视图,但我没有使用 cursorAdapter。有人有什么想法吗?很想了解这一点。