Android游标中“fillWindow()中的无效语句”是什么意思?

时间:2010-11-16 14:22:19

标签: android cursor

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

Cursor: invalid statement in fillWindow().

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

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

5 个答案:

答案 0 :(得分:32)

处理ListActivities时,此问题与活动停止时未正确关闭的Cursor对象,CursorAdapter对象和数据库对象有关,并且在活动开始或恢复时未正确设置。

我必须确保在TabActivity恢复时调用的Activity的onStop方法中,以相应的顺序关闭了我的SimpleListAdapter,我的游标,然后关闭了我的数据库对象。

我已经关闭了Cursor和Database对象,但还没有关闭我的SimpleListAdapter Cursor。

/**
   * 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

答案 1 :(得分:19)

以正确的顺序关闭游标,数据库,DBHelper是至关重要的。

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

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

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

结账的顺序应该是:

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

否则不同的错误会继续产生,开发人员甚至不会了解它。 “Cursor:fillWindow()中的无效语句”是其中一个错误。

答案 2 :(得分:7)

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

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

如果您稍后尝试使用光标,您将获得漂亮的“无效语句”,因为光标所依赖的连接已经关闭。

答案 3 :(得分:1)

如果您使用的是自定义类实例,例如Model m DatabaseManager,其中包含SQLiteDatabase:模型 - > DatabaseManager-> SQLiteDatabase

然后,如果你对m进行查询(对适当的代理进行查询),然后你做m.close()(实际上关闭SQLiteDatabase)之类的东西,之后你尝试使用Cursor你会得到那个错误。

解决方案是:首先使用光标,然后关闭Db。

我的回答是基于目前为止的2个,这激励我解决问题。

答案 4 :(得分:1)

我仍然遇到'fillWindow()中的'无效语句'错误。

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

例如,如果我在活动A的列表视图中,并且在开始新活动B之前关闭了游标,那么当我返回活动A时,我没有得到'fillWindow()中的'无效语句'。

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

如何优雅地解决此问题?

编辑: 我今天早上确实想到了这一点。我添加了

this.stopManagingCursor(this.myListCursor);

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