La fermeture de la base de données dans un ContentProvider
Cette semaine, j'ai été à l'apprentissage tout au sujet de ContentProvider et à l'aide de la SQLiteOpenHelper classe pour gérer la création et la mise à niveau de la base de données à l'intérieur d'un prestataire. Plus précisément, j'ai de la lecture à travers l'exemple le bloc-notes dans le kit de développement du répertoire d'exemples.
Maintenant, je peux voir que SQLiteOpenHelper a une méthode close (). Je suis conscient que le laisser inactif bases de données open est une mauvaise pratique et peut provoquer des fuites de mémoire et autres joyeusetés (sauf cette discussion est dirigé dans la bonne direction). Si je ont été à l'aide de la classe dans une Activité, je voudrais simplement appeler close() dans le onDestroy() la méthode, mais pour autant que je sais, ContentProvider n'ont pas le même cycle de vie que les activités à faire. Le code pour le bloc-notes ne semble jamais à appeler close(), je voudrais donc supposer qu'il est manipulé par SQLiteOpenHelper ou une autre pièce du puzzle, mais j'aimerais vraiment le savoir. Je n'ai pas vraiment confiance en l'exemple de code que beaucoup, que ce soit...
Question résumé: Quand doit-on fermer la base de données à un fournisseur, le cas échéant?
- Dianne Hackborn a dit, il ya pas besoin de fermer la db.
- C'est l'information la plus importante sur ce fil. J'ai fait une réponse.
Vous devez vous connecter pour publier un commentaire.
Selon Dianne Hackborn (Android cadre de l'ingénieur) il n'est pas nécessaire de fermer la base de données un fournisseur de contenu.
Merci @bigstones pour le rappeler.
Cette question est un peu vieux mais il est encore tout à fait pertinente. Notez que si vous êtes en train de faire des choses "moderne" (par exemple à l'aide de LoaderManager et la création de CursorLoaders à la requête d'un ContentProvider dans un thread d'arrière-plan), assurez-vous que vous n'appelez PAS db.close() dans votre ContentProvider mise en œuvre. J'ai été faire toutes sortes d'incidents relatifs à CursorLoader/AsyncTaskLoader lorsqu'il a essayé d'accéder à la ContentProvider dans un thread d'arrière-plan, qui ont été résolus par le retrait de la db.close() appels.
Donc, si vous êtes en cours d'exécution dans les incidents qui ressemble à ceci (Jelly Bean 4.1.1):
Ou ce (ICS 4.0.4):
Ou si vous voyez des messages d'erreur dans le LogCat qui ressemblent à ceci:
Puis vérifiez votre ContentProvider la mise en œuvre et assurez-vous que vous n'êtes pas la fermeture de la base de données prématurément. Selon cette, le ContentProvider aurez nettoyé automatiquement lorsque le processus est tué de toute façon, de sorte que vous n'avez pas besoin de fermer sa base de données à l'avance.
Cela dit, assurez-vous que vous êtes toujours correctement:
Ive suivre Mannaz de réponse et vu que
SQLiteCursor(database, driver, table, query);
constructeur est obsolète. Ensuite, j'ai trouvégetDatabase()
méthode et l'a utilisé à la place demDatabase
pointeur; et gardé constructeur pour assurer une compatibilité descendanteSi vous voulez que votre Base de données pour fermer automatiquement, vous pouvez fournir une
CursorFactory
ouverture:Voici les classes:
Le fermer lorsque vous avez terminé avec elle, de préférence dans un bloc finally vous pouvez vous assurer que ça se passe. Je sais que cela semble un peu banal et hors-la-brassard, mais c'est vraiment la seule réponse que je sache. Si vous ouvrez la base de données et effectuer une action, le fermer lorsque vous avez terminé avec cette action, sauf si vous savez pour un fait, il sera à nouveau nécessaire (dans ce cas, assurez-vous de le fermer une fois il n'est plus nécessaire).
Si vous êtes à l'aide de votre fournisseur de contenu à l'intérieur d'une activité, alors je ne crois pas que vous avez à maintenir la connexion du fournisseur de contenu. Vous pouvez simplement gérer le curseur de l'objet renvoyé en utilisant startManagingCursor. Dans la méthode onPause de l'activité, vous pouvez relâcher le fournisseur de contenu. ( vous pouvez la recharger en onResume). En supposant que l'activité du cycle de vie le plus souvent limités, cela devrait suffire. (Atleast selon moi ;))