我有时会在logcat
输出中看到此错误,
Cursor: invalid statement in fillWindow().
当我按下后退键然后在转到我的自定义listview
之前转到默认的Android listview
时,有时会发生这种情况。
这是什么意思?我该如何解决?因为它没有指出问题来自的任何代码行。
答案 0 :(得分:32)
处理ListActivities时,此问题与活动停止时未正确关闭的Cursor对象,CursorAdapter对象和数据库对象有关,并且在活动开始或恢复时未正确设置。
我必须确保在TabActivity恢复时调用的Activity的onStop方法中,以相应的顺序关闭了我的SimpleListAdapter,我的游标,然后关闭了我的数据库对象。
我已经关闭了Cursor和Database对象,但还没有关闭我的SimpleListAdapter Cursor。
/**
* 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
答案 1 :(得分:19)
以正确的顺序关闭游标,数据库,DBHelper是至关重要的。
例如 对于下面给出的代码。
DBHelper dbhelper = new DBHelper();
SQLiteDataBase db = dbhelper.getWritableDatabase();
Cursor c = db.query(/*some parameters*/);
结账的顺序应该是:
c.close();
db.close();
dbhelper.close();
否则不同的错误会继续产生,开发人员甚至不会了解它。 “Cursor:fillWindow()中的无效语句”是其中一个错误。
答案 2 :(得分:7)
也许这可以帮到你:http://www.ragtag.info/2011/feb/1/database-pitfalls/
似乎对 getReadableDatabase 和 getWritableDatabase 的调用会返回与数据库相同的连接(即使您多次调用它们)。 因此,任何对其中任何一个 close()的调用都将关闭两个连接。
如果您稍后尝试使用光标,您将获得漂亮的“无效语句”,因为光标所依赖的连接已经关闭。
答案 3 :(得分:1)
如果您使用的是自定义类实例,例如Model m
DatabaseManager
,其中包含SQLiteDatabase
:模型 - > DatabaseManager-> SQLiteDatabase
然后,如果你对m进行查询(对适当的代理进行查询),然后你做m.close()
(实际上关闭SQLiteDatabase
)之类的东西,之后你尝试使用Cursor你会得到那个错误。
解决方案是:首先使用光标,然后关闭Db。
我的回答是基于目前为止的2个,这激励我解决问题。
答案 4 :(得分:1)
我仍然遇到'fillWindow()中的'无效语句'错误。
我已将问题缩小到我的ListView的SimpleCursorAdapter游标。
例如,如果我在活动A的列表视图中,并且在开始新活动B之前关闭了游标,那么当我返回活动A时,我没有得到'fillWindow()中的'无效语句'。
但是,在活动B加载之前,我看到活动A的列表视图中的列表在屏幕上消失,并且在显示活动B的屏幕之前,在隐藏屏幕之前短暂显示“未找到记录”消息。
如何优雅地解决此问题?
编辑: 我今天早上确实想到了这一点。我添加了
this.stopManagingCursor(this.myListCursor);
到我的ListActivity类中的onPause方法,并解决了'fillWindow()中的'无效语句'错误。