31

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

Cursor: invalid statement in fillWindow().

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

どういう意味ですか?どうすれば解決できますか?問題が発生しているコード行を指していないためです。

4

5 に答える 5

32

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

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()の無効なステートメント」はそのようなエラーの1つです。

于 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

カスタムクラスインスタンスを使用している場合。たとえばModel m、を保持しDatabaseManager、次にSQLiteDatabase:Model->DatabaseManager->SQLiteDatabaseを保持します。

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

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

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

于 2012-02-25T19:52:57.317 に答える
1

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

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

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

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

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

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

this.stopManagingCursor(this.myListCursor);

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

于 2012-12-13T23:01:55.230 に答える