Что означает «неверный оператор в fillWindow ()» в курсоре Android? - PullRequest
31 голосов
/ 16 ноября 2010

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

Cursor: invalid statement in fillWindow().

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

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

Ответы [ 5 ]

32 голосов
/ 08 февраля 2011

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

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

Я уже былзакрытие объектов 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
19 голосов
/ 30 ноября 2011

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

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

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

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

порядок закрытия долженбыть похожим на:

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

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

7 голосов
/ 13 марта 2012

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

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

Если вы попытаетесь использовать курсор позже, вы получите красивый «Неверный оператор», поскольку соединение, на которое опирается курсор, уже закрыто.

1 голос
/ 14 декабря 2012

У меня все еще есть проблемы с ошибкой «Неверный оператор в fillWindow ()».

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

Например, еслиЯ нахожусь в списке для действия A и закрываю курсор перед началом нового действия B, но не получаю «Неверный оператор в fillWindow ()» при возвращении к действию A.

Однакоперед загрузкой действия B я вижу, что список из списка действия A исчезает на экране, и на короткое время отображается сообщение «No Records Found» перед скрытием экрана, перед тем как отображается экран действия B.

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

РЕДАКТИРОВАТЬ: Я действительно понял это сегодня утром.Я добавил

this.stopManagingCursor(this.myListCursor);

к методу onPause в моих классах ListActivity, и это устранило ошибку «Недопустимый оператор в fillWindow ()».

1 голос
/ 25 февраля 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...