Android光标中的“fillWindow()中的无效语句”是啥意思?
Posted
技术标签:
【中文标题】Android光标中的“fillWindow()中的无效语句”是啥意思?【英文标题】:What does "invalid statement in fillWindow()" in Android cursor mean?Android光标中的“fillWindow()中的无效语句”是什么意思? 【发布时间】:2011-05-10 20:29:22 【问题描述】:我有时会在我的logcat
输出中看到此错误,
Cursor: invalid statement in fillWindow().
有时会发生这种情况,当我按下返回键,然后它转到默认的 android listview
,然后转到我的自定义 listview
。
这是什么意思?我该如何解决?因为它没有指向问题所在的任何代码行。
【问题讨论】:
遇到同样的问题,我刚刚发现了这个。它与您的数据库可能如何在错误的范围内运行有关。 groups.google.com/group/android-developers/browse_thread/thread/… 【参考方案1】:在处理 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
【讨论】:
我只是想感谢你,我只是在同样的问题上花了太长时间感到沮丧,而你的建议是我读到的唯一建议,它说要按特定顺序关闭事物,这很有效。谢谢! 您好。作为 Android 的新手,我刚刚在一个 Workshop 中了解到不能保证调用“onStop”。他们说,最好在“onPause”中做这些事情。只是说-如果我错了,请纠正我。我总是愿意向有经验的人学习。 如果这个问题(这似乎很重要!)有据可查,这个问题就不会出现。谢谢!我只希望我在之前找到这个我浪费了无数时间编写蹩脚的代码。 我有点怀疑这里的`dbActListObj`指的是什么? Akhil Jain,抱歉代码混乱。我对其进行了编辑并使用了一个更好、更易于理解的变量名。【参考方案2】:以正确的顺序关闭游标、数据库、DBHelpers 至关重要。
例如 对于下面给定的代码。
DBHelper dbhelper = new DBHelper();
SQLiteDataBase db = dbhelper.getWritableDatabase();
Cursor c = db.query(/*some parameters*/);
关闭的顺序应该是:
c.close();
db.close();
dbhelper.close();
否则会不断产生不同的错误,而开发人员甚至都不知道它。 “光标:fillWindow() 中的无效语句”是此类错误之一。
【讨论】:
如果我从自定义光标适配器(扩展光标适配器)的方法返回光标以用于我的列表活动,如何处理【参考方案3】:也许这可以帮助你:http://www.ragtag.info/2011/feb/1/database-pitfalls/
似乎对 getReadableDatabase 和 getWritableDatabase 的调用会返回相同 到数据库的连接(即使您对它们进行了多次调用)。 因此,任何对 close() 的调用都会关闭两个连接。
如果您稍后尝试使用游标,您会得到很好的“无效语句”,因为游标所依赖的连接已经关闭。
【讨论】:
【参考方案4】:如果您使用的是自定义 Class 实例,例如Model m
持有一个DatabaseManager
,而后者又持有一个SQLiteDatabase
:Model->DatabaseManager->SQLiteDatabase
然后,如果您对 m 进行查询(它执行适当的委托),然后您执行类似 m.close()
的操作(实际上关闭了 SQLiteDatabase
),然后您尝试使用光标,您会得到错误。
解决方法是:先使用游标,然后关闭Db。
我的回答是基于目前存在的 2 个,这启发了我解决问题。
【讨论】:
【参考方案5】:我仍然遇到“fillWindow() 中的无效语句”错误。
我已将问题缩小到我的 ListView 的 SimpleCursorAdapter 光标。
例如,如果我在 Activity A 的列表视图中,并且在开始新的 Activity B 之前关闭光标,则当我返回 Activity A 时,我不会收到“fillWindow() 中的无效语句”。
但是,在 Activity B 加载之前,我看到 Activity A 的列表视图中的列表在屏幕上消失了,并且在隐藏屏幕之前,在显示 Activity B 的屏幕之前短暂显示了“未找到记录”消息。
我怎样才能优雅地解决这个问题?
编辑: 我今天早上确实想到了这一点。我加了
this.stopManagingCursor(this.myListCursor);
到我的 ListActivity 类中的 onPause 方法,这解决了“fillWindow() 中的无效语句”错误。
【讨论】:
我今天早上确实想到了这一点。我在我的 ListActivity 类的 onPause 方法中添加了“this.stopManagingCursor(this.myListCursor)”,这解决了“fillWindow() 中的无效语句”错误。以上是关于Android光标中的“fillWindow()中的无效语句”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio,如何使用数组或光标中的数据填充自定义 ListView?
如何从Android中的数据库中获取数据?通过光标 c= db.query?