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/

似乎对 getReadableDatabasegetWritableDatabase 的调用会返回相同 到数据库的连接(即使您对它们进行了多次调用)。 因此,任何对 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中的时间戳列值?

如何将光标中的值存储到android中的字符串中

Android Studio,如何使用数组或光标中的数据填充自定义 ListView?

如何从Android中的数据库中获取数据?通过光标 c= db.query?

如何使回车键将光标移动到 Android Studio 中的行尾,就像在 Eclipse 中一样

Android中的EditText中,输入信息时,怎么能让光标停靠在输入的信息的右侧而不是左侧呢?