31

我有时会在logcat输出中看到这个错误,

Cursor: invalid statement in fillWindow().

当我按下后退键然后在listview进入我的自定义之前进入默认 Android 时,有时会发生这种情况listview

这是什么意思?我该如何解决?因为它没有指向问题所在的任何代码行。

4

5 回答 5

32

在处理 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
于 2011-02-07T23:09:58.033 回答
19

以正确的顺序关闭游标、数据库、DBHelpers 至关重要。

例如对于下面给定的代码。

DBHelper dbhelper = new DBHelper();
SQLiteDataBase db = dbhelper.getWritableDatabase();

Cursor c = db.query(/*some parameters*/);

关闭的顺序应该是:

c.close();
db.close();
dbhelper.close();

否则会不断产生不同的错误,开发人员甚至都不知道它。“光标:fillWindow() 中的无效语句”是此类错误之一。

于 2011-11-30T12:24:33.247 回答
7

也许这可以帮助你:http ://www.ragtag.info/2011/feb/1/database-pitfalls/

似乎对getReadableDatabasegetWritableDatabase的调用返回到数据库的相同连接(即使您对它们进行了多次调用)。因此,对其中任何一个的close()的任何调用都将关闭两个连接。

如果您稍后尝试使用游标,您会得到很好的“无效语句”,因为游标所依赖的连接已经关闭。

于 2012-03-12T20:29:26.413 回答
1

我仍然遇到“fillWindow() 中的无效语句”错误的问题。

我已将问题缩小到 ListView 的 SimpleCursorAdapter 光标。

例如,如果我在 Activity A 的列表视图中,并且在开始新的 Activity B 之前关闭了光标,则当我返回 Activity A 时,我不会收到“fillWindow() 中的无效语句”。

但是,在 Activity B 加载之前,我看到 Activity A 的列表视图中的列表消失在屏幕上,并且在隐藏屏幕之前,在显示 Activity B 的屏幕之前短暂显示“未找到记录”消息。

我怎样才能优雅地解决这个问题?

编辑:我今天早上真的想通了。我添加了

this.stopManagingCursor(this.myListCursor);

到我的 ListActivity 类中的 onPause 方法,这解决了“fillWindow() 中的无效语句”错误。

于 2012-12-13T23:01:55.230 回答
1

如果您使用的是自定义 Class 实例,例如Model m包含 a DatabaseManager,而后者又包含 a SQLiteDatabase:Model->DatabaseManager->SQLiteDatabase

然后,如果您对 m 进行查询(它执行适当的委托),然后您执行类似的操作m.close()(实际上关闭了SQLiteDatabase),然后您尝试使用光标,您将收到该错误。

解决方法是:先使用游标,然后关闭Db。

我的回答是基于目前存在的 2 个,这启发了我解决问题。

于 2012-02-25T19:52:57.317 回答