CursorLoader utilisation sans ContentProvider
Android SDK documentation dit que startManagingCursor()
méthode est depracated:
Cette méthode est obsolète. L'utilisation de la nouvelle CursorLoader classe avec LoaderManager; ce qui est également disponible sur les anciennes plates-formes sur Android package de compatibilité. Cette méthode permet à l'activité de prendre soin de la gestion de la donnée Curseur du cycle de vie pour vous en fonction de l'activité du cycle de vie. C'est, lorsque l'activité est arrêtée il appelle automatiquement désactiver() sur le Curseur, et lorsqu'il est redémarré plus tard il fera appel requery() pour vous. Lorsque l'activité est détruite, tous gérés Curseurs sera fermé automatiquement. Si vous ciblez en NID d'abeille ou plus tard, pensez plutôt à l'aide de LoaderManager au lieu de cela, disponible via getLoaderManager()
Donc je voudrais utiliser CursorLoader
. Mais comment puis-je l'utiliser avec personnalisé CursorAdapter
et sans ContentProvider
, quand j'ai besoin d'URI dans le constructeur de CursorLoader
?
- Lockwood pourquoi nous utilisons des CursorAdapter sans ContentProvider veuillez me suggérer stackoverflow.com/questions/20419278/...
- pourquoi nous utilisons des CursorAdapter sans ContentProvider veuillez me suggérer stackoverflow.com/questions/20419278/...
Vous devez vous connecter pour publier un commentaire.
J'ai écrit un simple CursorLoader qui n'a pas besoin d'un fournisseur de contenu:
Il a seulement besoin de
AsyncTaskLoader
classe. L'un dans Android 3.0 ou supérieur, ou celui qui est livré avec le package de compatibilité.J'ai aussi a écrit un
ListLoader
qui est compatible avec laLoadManager
et est utilisée pour récupérer un génériquejava.util.List
collection.Écrire votre propre chargeur qui utilise votre base de données de la classe au lieu d'un fournisseur de contenu. La façon la plus simple est juste de prendre la source de la
CursorLoader
classe à partir de la bibliothèque de compatibilité, et de remplacer le fournisseur de requêtes avec des requêtes à votre propre db classe d'aide.CursorLoader
descendat pour gérer un SQLite curseur, appart à partir du constructeur j'ai seulement besoin de remplacer laloadInBackground
méthode pour remplacer le fournisseur de requête avec mon curseur de requêteLa SimpleCursorLoader est une solution simple, cependant il ne prend pas en charge la mise à jour de la grue lorsque les modifications de données. CommonsWare a un loaderex bibliothèque qui ajoute un SQLiteCursorLoader et prend en charge la ré-interroger sur les modifications de données.
https://github.com/commonsguy/cwac-loaderex
Une troisième option serait de simplement remplacer
loadInBackground
:Cela permettra également de prendre soin de ré-interrogation de votre curseur lorsque les modifications de base de données.
Seul inconvénient: Vous devrez définir un autre observateur, puisque Google dans son infinie sagesse, a décidé de faire de leur colis privé. Si vous mettez de la classe dans le même emballage que celui d'origine (ou la compat un), vous pouvez en fait utiliser l'original de l'observateur. L'observateur est une très légère objet et n'est pas utilisé ailleurs, donc ce n'est pas beaucoup de différence.
loadInBackground()
, avant de revenir le curseur, direcursor.setNotificationUri(getContext().getContentResolver(), uri);
l'uri peut juste de Chaîne aléatoire commeUri.parse("content://query_slot1")
. Sembler comme il ne se soucie pas de l'uri existent vraiment ou pas. Et une fois que j'ai fait l'opération sur DB. DiregetContentResolver().notifyChange(uri, null);
ferait l'affaire. Ensuite, j'ai peut créer quelques "requête uri fente" dans un contant de fichier pour l'application avec un petit nombre de requête. Je test insérer le DB d'enregistrement lors de l'exécution, et il semble fonctionner, mais je doute encore qu'il est de bonne pratique onit. Toute suggestion?La troisième option proposée par Timo Ohr, ainsi que les commentaires Yeung, fournir la réponse la plus simple (rasoir d'Occam). Ci-dessous est un exemple d'une classe complète qui fonctionne pour moi. Il y a deux règles d'utilisation de cette classe.
Tout le temps que les modifications de base de données (par exemple, après une insertion ou suppression), assurez-vous d'appeler
où myUri est le même que celui retourné à partir de votre mise en œuvre de la méthode getContentUri().
Voici le code de la classe que j'ai utilisé: