31 votes

Que signifie «déclaration invalide dans fillWindow ()» dans le curseur Android?

Je vois parfois cette erreur dans ma sortie logcat ,

 Cursor: invalid statement in fillWindow().
 

Cela se produit parfois lorsque j'appuie sur la touche Retour, puis il passe à Android par défaut listview avant d'accéder à mon listview .

Qu'est-ce que ça veut dire? Comment le résoudre? Parce qu'il ne pointe vers aucune ligne de code d'où vient le problème.

32voto

Bryan Hepburn Points 1047

Lorsque vous traitez avec ListActivities, cette question a à voir avec le Curseur objets, CursorAdapter objets, et les objets de Base de données n'étant pas fermé correctement lors de l'arrêt de l'Activité, et de ne pas être correctement réglé lorsque l'Activité commence ou reprend.

J'ai dû faire en sorte que j'ai fermé mon SimpleListAdapter, mon Curseurs, et puis mes objets de Base de données dans l'ordre, dans la méthode onStop de l'Activité qui est appelée lorsque l'TabActivity reprend.

J'avais déjà été la fermeture du Curseur et les objets de Base de données, mais n'avait pas été la fermeture de mon SimpleListAdapter Curseur.

/**
   * 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

19voto

jaydeepw Points 833

Il est de la plus haute importance que vous fermiez les curseurs, les bases de données et les DBHelpers dans le bon ordre.

par exemple pour le code donné ci-dessous.

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

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

l'ordre de fermeture doit être comme:

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

Sinon, différentes erreurs continuent d'apparaître et le développeur ne le sait même pas. «Cursor: invalid statement in fillWindow ()» étant l'une de ces erreurs.

7voto

Peut-être cela peut vous aider: http://www.ragtag.info/2011/feb/1/database-pitfalls/

Il semble que les appels à la getReadableDatabase et getWritableDatabase renvoie la même connexion à la base de données (même si vous avez fait plusieurs appels à eux). Ainsi, tout appel à close() sur l'un d'eux va à la fermeture de la connexion(s).

Si vous avez essaye d'utiliser un curseur plus tard, vous aurez la belle déclaration Invalide', puisque la connexion de laquelle le curseur se fie est déjà fermé.

1voto

Caumons Points 1702

Si vous utilisez une occurrence de Classe personnalisée par exemple, Model m qui détient un DatabaseManager, qui détient une SQLiteDatabase: Modèle->DatabaseManager->SQLiteDatabase

Alors, si vous faites une requête de m (ce qui n'est le cas délégations) et puis tu fais quelque chose comme m.close() (ce qui ferme l' SQLiteDatabase) et après que vous essayez d'utiliser le Curseur, vous obtiendrez cette erreur.

La solution est: d'abord utiliser le curseur, puis fermez la Db.

Ma réponse est basée dans les 2 existants jusqu'à présent, qui m'a inspiré pour résoudre le problème.

1voto

Bryan Hepburn Points 1047

Je suis toujours avoir des problèmes avec le 'instruction non Valide dans fillWindow()' erreur.

J'ai réduit la question de la SimpleCursorAdapter curseur pour ma ListView.

Par exemple, si je suis dans la listview pour une Activité Un, et je ferme le curseur avant le démarrage d'une nouvelle Activité B, je n'ai pas l 'instruction non Valide dans fillWindow ()" quand je suis de retour à l'Activité A.

Toutefois, avant d'Activité B charges, je vois la liste de l'Activité de la listview disparaître de l'écran, et la "Aucun enregistrement Trouvé" affiche brièvement avant que l'écran est masqué, avant d'Activité B s'affiche à l'écran.

Comment puis-je gracieusement résoudre ce problème?

EDIT: J'ai en fait compris cela ce matin. J'ai ajouté

this.stopManagingCursor(this.myListCursor);

pour la méthode onPause dans mon ListActivity classes, et qui a résolu le 'instruction non Valide dans fillWindow()' erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X