Подтвердить что ты не робот

Что означает "неверный оператор в fillWindow()" в Android-курсоре?

Я иногда вижу эту ошибку в моем logcat выходе,

Cursor: invalid statement in fillWindow().

Иногда бывает, когда я нажимаю клавишу "Назад", а затем переходит к стандартным Android listview перед тем, как перейти к своему пользовательскому listview.

Что это значит? Как это решить? Потому что он не указывает на какую-либо строку кода, из которой возникает проблема.

4b9b3361

Ответ 1

При работе с ListActivities эта проблема связана с объектами Cursor, объектами CursorAdapter и объектами базы данных, которые не закрываются должным образом, когда Activity останавливается и не устанавливается должным образом, когда активность запускается или возобновляется.

Мне пришлось убедиться, что я закрыл свой SimpleListAdapter, мои курсоры, а затем мои объекты базы данных в соответствующем порядке в методе onStop Activity, который вызывается при возобновлении TabActivity.

Я уже закрывал объекты курсора и базы данных, но не закрывал свой курсор 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

Крайне важно, чтобы вы закрыли курсоры, базы данных, DBHelpers в правильном порядке.

например. для данного кода ниже.

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

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

порядок закрытия должен выглядеть следующим образом:

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

В противном случае разные ошибки сохраняются при нерестах, и разработчик даже не узнает об этом. "Курсор: неверный оператор в fillWindow()" является одной из таких ошибок.

Ответ 3

Возможно, это может вам помочь: http://www.ragtag.info/2011/feb/1/database-pitfalls/

Кажется, что вызовы getReadableDatabase и getWritableDatabase возвращают то же соединение с базой данных (даже если вы сделали несколько звонков на них). Таким образом, любой вызов close() для любого из них закроет оба соединения.

Если вы попытаетесь использовать курсор позже, вы получите хороший "Invalid statement", поскольку соединение, на которое полагается курсор, уже закрыто.

Ответ 4

Если вы используете собственный экземпляр класса, например. Model m, который содержит DatabaseManager, который, в свою очередь, содержит SQLiteDatabase: Model- > DatabaseManager- > SQLiteDatabase

Затем, если вы выполняете запрос к m (что делает соответствующие делегаты), а затем вы делаете что-то вроде m.close() (которое фактически закрывает SQLiteDatabase), и после этого вы пытаетесь использовать Курсор, вы получите это ошибка.

Решение: сначала используйте курсор, а затем закройте Db.

Мой ответ основан на двух существующих до сих пор, которые вдохновили меня решить проблему.

Ответ 5

У меня все еще возникают проблемы с "Недопустимый оператор в ошибке fillWindow()".

Я сузил проблему до курсора SimpleCursorAdapter для своего ListView.

Например, если я участвую в списке для Activity A, и я закрываю курсор перед началом нового действия B, я не получаю "Invalid statement in fillWindow()", когда возвращаюсь к Activity A.

Однако, перед загрузкой Activity B, я вижу, что список из Activity List исчезает на экране, а сообщение "Нет записей" отображается ненадолго до того, как экран будет скрыт, пока не появится экран Activity B.

Как я могу изящно решить эту проблему?

EDIT: Я действительно понял это сегодня утром. Я добавил

this.stopManagingCursor(this.myListCursor);

к методу onPause в моих классах ListActivity и разрешил ошибку Invalid в ошибке fillWindow().