代码之家  ›  专栏  ›  技术社区  ›  irobotxx

Android cursor中的“invalid statement in fillWindow()”是什么意思?

  •  31
  • irobotxx  · 技术社区  · 15 年前

    我有时在我的 logcat 输出,

    Cursor: invalid statement in fillWindow().
    

    当我按下back键,然后转到默认的Android时,有时会发生这种情况 listview 在去我的海关之前 列表视图 .

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

    5 回复  |  直到 13 年前
        1
  •  32
  •   Bryan    13 年前

    在处理ListActivities时,此问题与游标对象、CursorAdapter对象和数据库对象在活动停止时未正确关闭以及在活动启动或恢复时未正确设置有关。

    我必须确保在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
    
        2
  •  19
  •   JaydeepW    13 年前

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

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

    DBHelper dbhelper = new DBHelper();
    SQLiteDataBase db = dbhelper.getWritableDatabase();
    
    Cursor c = db.query(/*some parameters*/);
    

    成交顺序如下:

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

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

        3
  •  7
  •   Jesus Monzon Legido    14 年前

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

    似乎 getReadableDatabase数据库 getWritableDatabase数据库 回报 相同的 连接到数据库(即使您多次调用它们)。 所以,任何电话 关闭() 它们中的任何一个都将关闭两个连接。

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

        4
  •  1
  •   Caumons    14 年前

    如果使用自定义类实例,例如。 Model m 持有 DatabaseManager ,它依次持有 SQLiteDatabase :Model->数据库管理器->SQLiteDatabase

    然后,如果您查询m(它执行适当的委托),然后执行如下操作 m.close() (它实际上关闭了 数据操作 )然后你尝试使用光标,你会得到那个错误。

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

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

        5
  •  1
  •   Bryan    13 年前

    “fillWindow()中的无效语句”错误仍有问题。

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

    例如,如果我在活动A的列表视图中,并且在启动新活动B之前关闭了光标,那么当我返回活动A时,不会得到“Invalid statement in fillWindow()”。

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

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

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

    this.stopManagingCursor(this.myListCursor);

    到我的ListActivity类中的onPause方法,该方法解决了“Invalid statement in fillWindow()”错误。