Finalisation d'un curseur qui n'a pas été désactivé ou fermé erreur non fatale

Je reçois une erreur «Finalizing a Cursor qui n'a pas été désactivée ou fermée» sur ce code. Le code est utilisé pour remplir une liste.

Puisqu'il s'agit d'une erreur non fatale, il n'y a pas de panne et tout semble fonctionner bien … mais je n'aime pas l'erreur.

  • Le projet "appcompat_v7" est créé automatiquement après la création d'un nouveau projet dans Eclipse
  • La différence entre: SAX Parser, XPath, DOM, XMLPullParser
  • Puis-je raccrocher un appel par programme dans Android?
  • Comment utiliser onSavedInstanceState exemple s'il vous plaît
  • La barre d'action s'affiche de manière incorrecte lors du retour du mode immersif
  • Taille de police de TextView dans l'application Android modifie la modification de la taille de la police des paramètres natifs
  • Si je ferme le curseur à la fin de ce code … la lecture de la liste est vide. Si je ferme le curseur dans onStop, j'ai la même erreur.

    Comment puis-je réparer ça??

    private void updateList() { DBAdapter db = new DBAdapter(this); db.open(); //load all waiting alarm mCursor=db.getTitles("state<2"); setListAdapter(new MyCursorAdapter(this, mCursor)); registerForContextMenu(getListView()); db.close(); } error : E/Cursor ( 2318): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/xxxxxxxxxxxxxxx.db, table = alerts, query = SELECT _id, alert_id, E/Cursor ( 2318): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here E/Cursor ( 2318): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210) E/Cursor ( 2318): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java: 53) E/Cursor ( 2318): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java: 1345) E/Cursor ( 2318): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java: 1229) .... .... 

  • Comprendre le Canvas.saveLayer d'Android (...)
  • Emulation Force Stop de ADB / Shell Commands
  • Utilisation des transitions d'activité SharedElement avec une vue personnalisée
  • Affichage de l'heure au format AM / PM dans Android
  • Android: Fichier IO à partir de la carte SD à l'aide du NDK
  • Quand utiliser Android PopupWindow vs Dialog
  • 9 Solutions collect form web for “Finalisation d'un curseur qui n'a pas été désactivé ou fermé erreur non fatale”

    Vous ne devriez pas recevoir ce message si vous fermez le Cursor dans onStop() ou onDestroy() . Essayez-le à nouveau. Ou appelez startManagingCursor() après avoir startManagingCursor() le Cursor de votre requête, et Android va fermer le Cursor seul.

    Scott

    J'ai rencontré le même problème que vous. Avant de fermer votre base de données, par exemple "db.close ()", assurez-vous que vos curseurs sont fermés en premier, c'est-à-dire "mCursor.close ()"

    Ainsi:

     private void updateList() { DBAdapter db = new DBAdapter(this); db.open(); //load all waiting alarm mCursor=db.getTitles("state<2"); setListAdapter(new MyCursorAdapter(this, mCursor)); registerForContextMenu(getListView()); // Let's close the cursor. mCursor.close(); db.close(); } 

    Vous avez mentionné que si vous avez fermé votre curseur, la vue de votre liste reste vide. Je vous recommande de transmettre les informations vers une classe et de la copier (allouer la mémoire) puis fermez le curseur.

    Lorsqu'une requête renvoie un curseur, elle est réellement positionnée "avant" le premier enregistrement dans le curseur. Un adaptateur tentera de faire un 'getItem' au premier élément afin qu'il échoue car le curseur n'est pas positionné.

    Dans mes adaptateurs de base, je fais un cursorMoveToPosition sur getViews. Cela semble éliminer le besoin du premier mouvement.

    N'utilisez pas startManagingCursor () car ce n'est plus l'approche recommandée. Le problème se produit car une connexion de curseur / DB n'est toujours pas fermée au moment où le finisseur obtient cet objet. Vous pouvez éviter cela en permettant à un chargeur de gérer le curseur ou de suivre toutes les connexions curseur / DB / SQLiteOpenHelper vous-même et de nettoyer après elles.

    L'utilisation d'un chargeur est assez lourde et nécessite beaucoup de pièces mobiles pour qu'il fonctionne en conjonction avec une vue de liste. D'autre part, le suivi de votre curseur et les connexions de la base de données est susceptible d'être humain. Si le nombre d'objets curseur / DB est bas, je recommanderais cette dernière solution. Sinon, laissez un chargeur gérer vos connexions.

    Fermez l'objet du curseur partout où vous le créez.

    Lorsque vous créez un objet de curseur et que vous effectuez un passage à travers une table SQLite, fermez-le après avoir été utilisé. Cette fermeture du curseur empêche l'exception dans logcat.

    Vous n'obtiendrez aucune exception liée à la finalisation du curseur laissé ouvert.

    Cela a également corrigé le même problème dans ma demande.

    J'ai lutté avec ce problème pendant deux jours. J'essayais d'obtenir un exemple de code de travail qui a passé un curseur, renvoyé d'une requête de base de données, directement à List Adapter – pas d'adaptateur intérimaire. Il a refusé de travailler – il suffit d'afficher un écran vierge – jusqu'à ce que j'ai invoqué 'moveToFirst ()' sur le curseur avant de le passer à ListAdapter. Allez comprendre! Quand je commentai cela, il se casse.

    Je pensais juste que je partagerais cela pour sauver les mêmes luttes que moi.

    Si quelqu'un peut éclairer pourquoi il en est ainsi, j'apprécierais cela. Je n'ai pas eu à invoquer moveToFirst sur les curseurs jusqu'à maintenant, pour les faire fonctionner correctement.

    Juste eu le même problème et je pensais le faire savoir – au cas où …

    J'ai accidentellement appelé ma routine de récupération deux fois et par la présente "perdu" le curseur résultant du premier appel. Cela a causé l'erreur.

    J'ai également eu des problèmes avec la fermeture du curseur:

    • La fermeture du curseur juste après le réglage de l'adaptateur de la vue de liste fait que le curseur se ferme avant que les données ne s'affichent.

    • Impossible d'utiliser startManagingCursor pour gérer le curseur car il a été obsolète.

    • Le nouveau remplacement cursorLoader pour startManagingCursor semble être une overkill.

    • Le déplacement de la position du curseur comme indiqué ne fonctionnait pas.

    • Faire de la tâche une classe intérieure de l'activité et fermer le curseur dans la méthode OnDestroy de l'activité fonctionne parfois, mais pas tout le temps.

    • Faire fonctionner une classe intérieure de l'activité et fermer le curseur dans la méthode onStop de l'activité semble fonctionner.

    J'ai également découvert que je peux fermer la base de données et l'assistant ouvert sqlite avant de fermer le curseur. Je peux même les fermer juste après avoir configuré l'adaptateur de la liste. Les données seront toujours affichées.

    StartManagingCursor (curseur);

    Cela a réglé mon problème

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.