web-dev-qa-db-ja.com

AndroidカーソルのfillWindow()の無効なステートメント」とはどういう意味ですか?

logcat出力にこのエラーが表示されることがあります。

Cursor: invalid statement in fillWindow().

戻るキーを押してから、カスタムlistviewに移動する前に、デフォルトのAndroid listviewに移動すると発生することがあります。

どういう意味ですか?どうすれば解決できますか?問題の原因となっているコード行を指していないためです。

31
irobotxxx

ListActivitiesを処理する場合、この問題は、Cursorオブジェクト、CursorAdapterオブジェクト、およびDatabaseオブジェクトが、アクティビティの停止時に適切に閉じられず、アクティビティの開始または再開時に適切に設定されないことに関係しています。

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
32
Bryan

カーソル、データベース、DBHelpersを正しい順序で閉じることが最も重要です。

例:以下の特定のコードに対して。

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

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

終了の順序は次のようになります。

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

そうしないと、さまざまなエラーが発生し続け、開発者はそれについてさえ知りません。 「カーソル:fillWindow()の無効なステートメント」はそのようなエラーの1つです。

19
JaydeepW

多分これはあなたを助けることができます: http://www.ragtag.info/2011/feb/1/database-pitfalls/

getReadableDatabaseおよびgetWritableDatabaseを呼び出すとsameデータベースへの接続(データベースに複数回呼び出した場合でも)。したがって、それらのいずれかでclose()を呼び出すと、両方の接続が閉じられます。

後でカーソルを使おうとすると、カーソルが依存している接続がすでに閉じられているため、Niceの「無効なステートメント」が表示されます。

7

カスタムクラスインスタンスを使用している場合(例: DatabaseManagerを保持する_Model m_、次にSQLiteDatabaseを保持する:Model-> DatabaseManager-> SQLiteDatabase

次に、m(適切な委任を行う)に対してクエリを実行し、次にm.close()(実際にはSQLiteDatabaseを閉じる)のような操作を行った後、カーソルを使用しようとします。そのエラーが発生します。

解決策は次のとおりです。最初にカーソルを使用してから、Dbを閉じます。

私の回答は、これまでに存在していた2つに基づいており、問題を解決するきっかけになりました。

1
Caumons

'fillWindow()の無効なステートメント'エラーでまだ問題があります。

ListViewのSimpleCursorAdapterカーソルに問題を絞り込みました。

たとえば、アクティビティAのリストビューを表示していて、新しいアクティビティBを開始する前にカーソルを閉じると、アクティビティAに戻ったときに「fillWindow()の無効なステートメント」が表示されません。

ただし、アクティビティBが読み込まれる前に、アクティビティAのリストビューのリストが画面に表示されなくなり、画面が非表示になる前、アクティビティBの画面が表示される前に、「レコードが見つかりません」というメッセージが短時間表示されます。

この問題を適切に解決するにはどうすればよいですか?

編集:私は実際に今朝これを理解しました。追加した

this.stopManagingCursor(this.myListCursor);

listActivityクラスのonPauseメソッドに追加すると、「fillWindow()の無効なステートメント」エラーが解決されました。

1
Bryan