我有一个活动填充列表并从游标中执行其他操作。我从一个方法中获取光标,该方法根据标准的android SQLite查询将其返回到我的数据库。该方法在我的SQLHelper
类中定义。该方法打开数据库,查询,关闭数据库,并返回游标。在活动中收集光标后,我拨打startManagingCursor(cursor);
一切正常。
当我启动子活动然后回到第一个活动时,问题就出现了。我通过以下输出得到一个力:
07-28 18:11:04.674: ERROR/AndroidRuntime(224): java.lang.RuntimeException: Unable to resume activity {blabla}: java.lang.IllegalStateException: mQuery SELECT * FROM vehicles WHERE _id=? 1
...
07-28 18:11:04.674: ERROR/AndroidRuntime(224): Caused by: java.lang.IllegalStateException: mQuery SELECT * FROM vehicles WHERE _id=? 1
07-28 18:11:04.674: ERROR/AndroidRuntime(224): at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:162)
07-28 18:11:04.674: ERROR/AndroidRuntime(224): at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:536)
...
07-28 18:11:04.674: ERROR/AndroidRuntime(224): Caused by: android.database.sqlite.SQLiteMisuseException: library routine called out of sequence: handle 0x0
07-28 18:11:04.674: ERROR/AndroidRuntime(224): at android.database.sqlite.SQLiteProgram.native_bind_string(Native Method)
07-28 18:11:04.674: ERROR/AndroidRuntime(224): at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:178)
07-28 18:11:04.674: ERROR/AndroidRuntime(224): at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:153)
问题显然是在尝试重新查询游标时。如果我在启动意图之前手动关闭光标,那么它可以正常工作。但是我需要手动重新查询它,而不是startManagingCursor()
的整个点?我在活动中有两个游标,它们都以相同的方式创建,我在两者上调用开始管理游标,都会导致恢复崩溃。
我还需要做些什么来让我的活动正确管理我的游标吗? 感谢。
答案 0 :(得分:3)
尝试关闭onPause()
(cursor.close()
)中的光标。如果您使用的是SimpleCursorAdapter
,则还应将光标从适配器上分离。
如果愿意,您可以在onResume()
方法中重新查询光标。
答案 1 :(得分:2)
好吧,事实证明Cursor.requery()已被折旧,每次我尝试调用它时都会遇到相同的错误。 startManagingCursor()正在调用requery,正如我想的那样,反过来导致我的问题......我不确定为什么requery在这个实例中导致错误,我之前已成功使用它。
我最终重新安排了一些代码,并将我的cursor = SQLHelper.getwhatevercursor()代码放入onResume()而不是onCreate,因为onResume无论如何都是在onCreate之后调用的。根据Nikola的建议,我也在onPause()中关闭游标。
这似乎现在正在起作用......