Android游标中的“fillWindow()中的invalid语句是什么意思?
我有时会看到这个错误在我logcat
输出,Android游标中的“fillWindow()中的invalid语句是什么意思?
Cursor: invalid statement in fillWindow().
当我按下返回键有时会发生,然后才去我的自定义listview
进入到默认的Android listview
。
这是什么意思?我如何解决它?因为它不指向问题来自的任何代码行。
当处理ListActivities时,此问题与活动停止时Cursor对象,CursorAdapter对象和数据库对象未正确关闭有关,而且在活动启动或恢复时未正确设置。
我必须确保在TabActivity恢复时调用的Activity的onStop方法中,按照相应的顺序关闭我的SimpleListAdapter,我的Cursors,然后关闭我的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
我只是想感谢你,我只是花了太长时间在这个同样的问题上感到沮丧,你的是我阅读的唯一建议说以一定的顺序关闭事情,这是有效的。谢谢! – 2011-10-27 21:34:39
你好。作为Android的新手,我刚刚在一个Workshop中学到了“onStop”不能保证被调用。他们说,最好在“onPause”上做那些事情。只是说 - 如果我错了,请纠正我。我总是愿意向有经验的人学习。 – Fildor 2011-11-22 08:43:53
如果这个问题(这看起来相当重要!)有充分的文件记录,这个问题就不会出现。谢谢!我只希望在*之前我发现了这个*我浪费了无数个小时编写糟糕的代码。 – 2012-05-21 16:56:49
按照正确的顺序关闭游标,数据库,DBHelpers是非常重要的。
例如,下面给出的代码为 。
DBHelper dbhelper = new DBHelper();
SQLiteDataBase db = dbhelper.getWritableDatabase();
Cursor c = db.query(/*some parameters*/);
收盘顺序应该是这样的:
c.close();
db.close();
dbhelper.close();
否则不同的错误继续产卵和开发商甚至不来认识一下它。 “光标:fillWindow()中的无效声明”是这样的错误之一。
如果我从自定义游标适配器的方法(扩展cursoradapter)为我的列表活动返回游标,那该怎么处理 – 2013-02-05 06:09:35
如果您使用自定义Class实例,例如Model m
持有一个DatabaseManager
,进而持有SQLiteDatabase
:型号 - > DatabaseManager-> SQLiteDatabase
然后,如果你做一个查询到m(它此时,相应的代表团),然后你像做m.close()
(事实上,关闭SQLiteDatabase
),然后你尝试使用光标,你会得到那个错误。
解决方法是:先使用光标,然后关闭Db。
我的回答是基于迄今为止存在的2个,这促使我解决了这个问题。
也许这可以帮助你:http://www.ragtag.info/2011/feb/1/database-pitfalls/
看来,调用getReadableDatabase和getWritableDatabase回报相同连接到数据库中(即使你多次打电话给他们)。 因此,任何致电close()的任何人都将关闭这两个连接。
如果您稍后尝试使用游标,您会得到很好的'无效语句',因为游标依赖的连接已关闭。
我仍然遇到'fillWindow()中的无效语句错误'错误。
我已经将问题缩小到我的ListView的SimpleCursorAdapter游标。
例如,如果我在活动A的列表视图中,并且在启动新的活动B之前关闭了光标,那么当我返回到活动A时,我没有在fillWindow()中获得'Invalid statement
但是,在活动B加载之前,我看到活动A的列表视图中的列表在屏幕上消失,并且在隐藏屏幕之前短暂显示“未找到记录”消息,然后显示活动B的屏幕。
我该如何优雅地解决此问题?编辑: 今天早上我其实已经想通了。我加
this.stopManagingCursor(this.myListCursor);
OnPause方法中在我的ListActivity类,这解决了“在fillWindow无效的声明()”的错误。
我今天早上真的想到了这个。我将'this.stopManagingCursor(this.myListCursor)'添加到我的ListActivity类的onPause方法中,并解决了fillWindow()中的'Invalid statement'错误。 – Bryan 2012-12-14 16:52:59
有同样的问题,我只是发现了这一点。它涉及你的数据库如何运行在错误的范围内。 http://groups.google.com/group/android-developers/browse_thread/thread/8bec793c626fb405 – Emile 2010-11-18 13:14:14