Android 什么是;fillWindow()中的语句无效;你的意思是什么?
我有时在我的Android 什么是;fillWindow()中的语句无效;你的意思是什么?,android,cursor,Android,Cursor,我有时在我的logcat输出中看到这个错误 Cursor: invalid statement in fillWindow(). 有时,当我按下后退键,然后转到默认的Androidlistview,然后再转到我的自定义listview,就会出现这种情况 这是什么意思?我如何解决它?因为它没有指向问题所在的任何代码行。在处理ListActivities时,此问题与活动停止时游标对象、游标适配器对象和数据库对象未正确关闭有关,并且在活动开始或恢复时未正确设置有关 我必须确保在TabActivity
logcat
输出中看到这个错误
Cursor: invalid statement in fillWindow().
有时,当我按下后退键,然后转到默认的Androidlistview
,然后再转到我的自定义listview
,就会出现这种情况
这是什么意思?我如何解决它?因为它没有指向问题所在的任何代码行。在处理ListActivities时,此问题与活动停止时游标对象、游标适配器对象和数据库对象未正确关闭有关,并且在活动开始或恢复时未正确设置有关 我必须确保在TabActivity恢复时调用的活动的onStop方法中,以相应的顺序关闭SimpleListAdapter、游标,然后关闭数据库对象 我已经关闭了游标和数据库对象,但没有关闭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
以正确的顺序关闭游标、数据库和数据库帮助程序非常重要 例如。 对于下面给定的代码
DBHelper dbhelper = new DBHelper();
SQLiteDataBase db = dbhelper.getWritableDatabase();
Cursor c = db.query(/*some parameters*/);
关闭顺序应如下所示:
c.close();
db.close();
dbhelper.close();
否则,不同的错误会不断产生,开发人员甚至不知道。“游标:fillWindow()中的无效语句”就是此类错误之一。如果您使用的自定义类实例(例如,
Model m
)包含DatabaseManager
,而后者又包含SQLiteDatabase
:Model->DatabaseManager->SQLiteDatabase>
然后,如果您对m进行查询(进行适当的委托),然后执行类似于m.close()
(实际关闭SQLiteDatabase
)的操作,然后尝试使用光标,您将得到该错误
解决方案是:首先使用光标,然后关闭数据库
我的回答基于到目前为止已有的2个,这激发了我解决问题的灵感。也许这可以帮助您:
似乎调用getReadableDatabase和getWritableDatabase返回到数据库的相同连接(即使您多次调用它们)。
因此,对其中任何一个调用close()都将关闭两个连接
如果您稍后尝试使用游标,您将得到一个很好的“无效语句”,因为游标所依赖的连接已经关闭。我仍然遇到“fillWindow()中的无效语句”错误 我已经将问题缩小到ListView的SimpleCursorAdapter光标 例如,如果我在活动A的listview中,并且在启动新活动B之前关闭了光标,那么当我返回到活动A时,不会得到“fillWindow()中的无效语句” 但是,在加载活动B之前,我看到活动A的listview中的列表在屏幕上消失,并且在隐藏屏幕之前,在显示活动B的屏幕之前,会短暂显示“未找到记录”消息 我如何才能优雅地解决这个问题 编辑:
我今天早上就知道了。我补充说
this.stopManagingCursor(this.myListCursor)代码>
到我的ListActivity类中的onPause方法,这解决了“fillWindow()中的语句无效”错误 有同样的问题,我刚刚发现了这个。它与数据库如何可能在错误的范围内运行有关。我只是想感谢你,我只是花了太长时间对这个问题感到沮丧,而你的建议是我读到的唯一建议,说要按一定的顺序关闭,这是有效的。谢谢你好。作为Android的新手,我刚刚在一次研讨会上了解到,“onStop”不一定会被调用。他们说,最好是在“暂停”中做这些事情。只是说-如果我错了,请纠正我。我总是愿意向有经验的人学习。如果这个问题(看起来很重要!)有很好的记录,这个问题就不会出现了。非常感谢。我只希望在我浪费无数时间编写蹩脚的代码之前就发现了这个。我有点怀疑这里的“dbActListObj”指的是什么?Akhil Jain,很抱歉代码太混乱了。我对它进行了编辑,并使用了一个更好、更容易理解的变量名。我今天早上就发现了这一点。我在ListActivity类的onPause方法中添加了“this.stopManagingCursor(this.myListCursor)”,这解决了“fillWindow()中的语句无效”错误。如果我从列表活动的自定义游标适配器(extends cursoradapter)的方法返回游标,该如何处理