54 votes

android - CursorLoader & SQLite sans Fournisseur de Contenu

Je sais que cela a été discuté mais je voulais vous demander à propos de l'état actuel de la question. Dois-je créer un ContentProvider à utiliser CursorLoader en connexion avec une base de données sqlite?

J'ai trouvé

L'utilisation de la CursorLoader sans ContentProvider

Est exactement ce que j'espérais encore que Emmby commenté

  • Les utilisateurs doivent être conscients d'une limitation, qui est qu'il n'a pas de mécanisme d'actualisation des données sur les modifications de données (comme les Chargeurs sont censé le faire)

Donc, une autre solution est mentionné

https://github.com/commonsguy/cwac-loaderex

encore une fois certains inconvénient est souligné

  • Toutefois, pour utiliser le renouvellement automatique de l'interrogation, vous devez utiliser le même chargeur pour l'INTERFACE utilisateur ainsi que pour les mises à jour, ce qui limite sa facilité d'utilisation pour les services d'arrière-plan.

Bien sûr, lors de l'utilisation de LoaderManager nous voulons obtenir toutes les prestations pour lesquelles il a été introduit. Donc ma question est si il existe un moyen d'utiliser LoaderManager en connexion avec une base de données sqlite sans avoir à mettre en œuvre un fournisseur de contenu encore de tous les avantages de celui-ci.

Merci

66voto

Alex Lockwood Points 31578

Les deux implémentations que vous mentionnez dans votre message à la fois d'offrir tous les avantages de l' CursorLoader à l'exception de la possibilité de recevoir des notifications lorsque le sous-jacent changements de contenu.

J'ai été à la recherche dans ce beaucoup récemment et je peux dire en toute confiance que l'API Android actuellement ne fournit pas un moyen de le faire avec seulement un raw SQLiteDatabase (il n'offre à l' ContentResolver#notifyChange() et Cursor#setNotificationUri() méthodes, qui sont utilisés pour informer tous Cursors enregistré sous un certain notification Uri).

Cela dit, vos options en ce moment sont:

  1. Mettre en œuvre un observateur de vous-même qui est capable de recevoir des notifications de l' SQLiteDatabase lorsque les changements de contenu, et est en quelque sorte en mesure de relayer ces notifications à tous les existants Loaders dans votre application. J'ai écrit un assez vaste, blog sur la façon de mettre en oeuvre Loaders qui pourraient vous être utiles si vous souhaitez relever ce défi. Ou...

  2. Utilisation Mark Murphy LoaderEx bibliothèque et seulement faire des modifications de base de données à l'aide de l' AsyncTask des opérations de sa bibliothèque. Notez que la raison pour laquelle ses tâches d'actualisation de l' Loader est parce qu'ils appellent onContentChanged sur le Loader immédiatement après l'insertion/mise à jour/suppression est effectuée, de manière efficace de raconter l' Loader que le contenu a changé et qu'il doit actualiser ses données.

  3. Il suffit d'utiliser un ContentProvider avec un CursorLoader et vous pouvez utiliser l' ContentResolver#notifyChange() méthode pour informer l' CursorLoader qu'un contenu a pas eu de changement.

J'essaie de trouver une meilleure solution, et je vais rendre compte à l'avenir si jamais je le trouve/mettre en œuvre, mais pour l'instant elles ont à faire.

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