我有时会在logcat
输出中看到这个错误,
Cursor: invalid statement in fillWindow().
当我按下后退键然后在listview
进入我的自定义之前进入默认 Android 时,有时会发生这种情况listview
。
这是什么意思?我该如何解决?因为它没有指向问题所在的任何代码行。
我有时会在logcat
输出中看到这个错误,
Cursor: invalid statement in fillWindow().
当我按下后退键然后在listview
进入我的自定义之前进入默认 Android 时,有时会发生这种情况listview
。
这是什么意思?我该如何解决?因为它没有指向问题所在的任何代码行。
在处理 ListActivities 时,这个问题与 Activity 停止时没有正确关闭 Cursor 对象、CursorAdapter 对象和 Database 对象有关,并且在 Activity 启动或恢复时没有正确设置。
我必须确保在 TabActivity 恢复时调用的 Activity 的 onStop 方法中按相应顺序关闭了 SimpleListAdapter、Cursors 和 Database 对象。
我已经关闭了 Cursor 和 Database 对象,但还没有关闭我的 SimpleListAdapter 游标。
/**
* onStop method
*
* Perform actions when the Activity is hidden from view
*
* @return void
*
*/
@Override
protected void onStop() {
try {
super.onStop();
if (this.mySimpleListAdapterObj !=null){
this.mySimpleListAdapterObj.getCursor().close();
this.mySimpleListAdapterObj= null;
}
if (this.mActivityListCursorObj != null) {
this.mActivityListCursorObj.close();
}
if (this.myDatabaseClassObj != null) {
this.myDatabaseClassObj.close();
}
} catch (Exception error) {
/** Error Handler Code **/
}// end try/catch (Exception error)
}// end onStop
以正确的顺序关闭游标、数据库、DBHelpers 至关重要。
例如对于下面给定的代码。
DBHelper dbhelper = new DBHelper();
SQLiteDataBase db = dbhelper.getWritableDatabase();
Cursor c = db.query(/*some parameters*/);
关闭的顺序应该是:
c.close();
db.close();
dbhelper.close();
否则会不断产生不同的错误,开发人员甚至都不知道它。“光标:fillWindow() 中的无效语句”是此类错误之一。
也许这可以帮助你:http ://www.ragtag.info/2011/feb/1/database-pitfalls/
似乎对getReadableDatabase和getWritableDatabase的调用返回到数据库的相同连接(即使您对它们进行了多次调用)。因此,对其中任何一个的close()的任何调用都将关闭两个连接。
如果您稍后尝试使用游标,您会得到很好的“无效语句”,因为游标所依赖的连接已经关闭。
我仍然遇到“fillWindow() 中的无效语句”错误的问题。
我已将问题缩小到 ListView 的 SimpleCursorAdapter 光标。
例如,如果我在 Activity A 的列表视图中,并且在开始新的 Activity B 之前关闭了光标,则当我返回 Activity A 时,我不会收到“fillWindow() 中的无效语句”。
但是,在 Activity B 加载之前,我看到 Activity A 的列表视图中的列表消失在屏幕上,并且在隐藏屏幕之前,在显示 Activity B 的屏幕之前短暂显示“未找到记录”消息。
我怎样才能优雅地解决这个问题?
编辑:我今天早上真的想通了。我添加了
this.stopManagingCursor(this.myListCursor);
到我的 ListActivity 类中的 onPause 方法,这解决了“fillWindow() 中的无效语句”错误。
如果您使用的是自定义 Class 实例,例如Model m
包含 a DatabaseManager
,而后者又包含 a SQLiteDatabase
:Model->DatabaseManager->SQLiteDatabase
然后,如果您对 m 进行查询(它执行适当的委托),然后您执行类似的操作m.close()
(实际上关闭了SQLiteDatabase
),然后您尝试使用光标,您将收到该错误。
解决方法是:先使用游标,然后关闭Db。
我的回答是基于目前存在的 2 个,这启发了我解决问题。