Android 什么是;fillWindow()中的语句无效;你的意思是什么?

Android 什么是;fillWindow()中的语句无效;你的意思是什么?,android,cursor,Android,Cursor,我有时在我的logcat输出中看到这个错误 Cursor: invalid statement in fillWindow(). 有时,当我按下后退键,然后转到默认的Androidlistview,然后再转到我的自定义listview,就会出现这种情况 这是什么意思?我如何解决它?因为它没有指向问题所在的任何代码行。在处理ListActivities时,此问题与活动停止时游标对象、游标适配器对象和数据库对象未正确关闭有关,并且在活动开始或恢复时未正确设置有关 我必须确保在TabActivity

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

Cursor: invalid statement in fillWindow().
有时,当我按下后退键,然后转到默认的Android
listview
,然后再转到我的自定义
listview
,就会出现这种情况


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

在处理ListActivities时,此问题与活动停止时游标对象、游标适配器对象和数据库对象未正确关闭有关,并且在活动开始或恢复时未正确设置有关

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

我已经关闭了游标和数据库对象,但没有关闭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

以正确的顺序关闭游标、数据库和数据库帮助程序非常重要

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

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

Cursor c = db.query(/*some parameters*/);
关闭顺序应如下所示:

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

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

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

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

解决方案是:首先使用光标,然后关闭数据库

我的回答基于到目前为止已有的2个,这激发了我解决问题的灵感。

也许这可以帮助您:

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


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

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

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

例如,如果我在活动A的listview中,并且在启动新活动B之前关闭了光标,那么当我返回到活动A时,不会得到“fillWindow()中的无效语句”

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

我如何才能优雅地解决这个问题

编辑:
我今天早上就知道了。我补充说

this.stopManagingCursor(this.myListCursor)


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

有同样的问题,我刚刚发现了这个。它与数据库如何可能在错误的范围内运行有关。我只是想感谢你,我只是花了太长时间对这个问题感到沮丧,而你的建议是我读到的唯一建议,说要按一定的顺序关闭,这是有效的。谢谢你好。作为Android的新手,我刚刚在一次研讨会上了解到,“onStop”不一定会被调用。他们说,最好是在“暂停”中做这些事情。只是说-如果我错了,请纠正我。我总是愿意向有经验的人学习。如果这个问题(看起来很重要!)有很好的记录,这个问题就不会出现了。非常感谢。我只希望在我浪费无数时间编写蹩脚的代码之前就发现了这个。我有点怀疑这里的“dbActListObj”指的是什么?Akhil Jain,很抱歉代码太混乱了。我对它进行了编辑,并使用了一个更好、更容易理解的变量名。我今天早上就发现了这一点。我在ListActivity类的onPause方法中添加了“this.stopManagingCursor(this.myListCursor)”,这解决了“fillWindow()中的语句无效”错误。如果我从列表活动的自定义游标适配器(extends cursoradapter)的方法返回游标,该如何处理