une activité ou d'un fragment doit avoir un chargeur séparé pour le type de chaque opération de base de données effectuée?

StackOverflow https://stackoverflow.com/questions/8814674

Question

Semble la manière recommandée par Google (en utilisant la bibliothèque de support Android) pour un fragment ou une activité à interagir avec une base de données SQLite est via un chargeur qui s'étend AsyncTaskLoader et fonctionne de manière similaire à la CursorLoader façon fait pour ContentProviders.

Une seule activité ou le fragment peut interagir avec une base de données de diverses façons, la mise à jour, la suppression et les données d'interrogation dans une ou plusieurs tables. Mais depuis un chargeur n'a qu'un seul endroit où effectuer la manipulation de base de données (par exemple dans loadInBackground()), est le développeur devrait écrire un chargeur distinct pour chaque type d'interaction, d'autant qu'il semble que la seule façon de paramétrer le comportement en loadInBackground() est en fournissant des arguments au constructeur du chargeur via l'argument args à LoaderManager.initLoader()?

Merci beaucoup.

Était-ce utile?

La solution

Quand ne pas utiliser un ContentProvider, à savoir l'utilisation de sqlite directement, utilisez AsyncTaskLoader si l'ensemble des opérations de base de données à des rendements effectué un Cursor. L'ensemble peut comprendre tout type d'opération - mise à jour, requête, suppression, insertion. Ces opérations doivent être exécutées dans AsyncTaskLoader.loadInBackground().

Si l'ensemble des opérations de base de données ne donne pas lieu à un Cursor être renvoyé, utilisez un AsyncTask. Dans ce cas, les opérations doivent être exécutées dans AsyncTask.doInBackground().

Autres conseils

Il y a deux principaux avantages à utiliser un CursorLoader dans votre application sur Activity.managedQuery():

  1. La requête est traitée sur un thread d'arrière-plan pour vous (avec la permission d'être Miser sur AsyncTaskLoader) si grandes requêtes de données ne bloquent pas l'interface utilisateur. Ceci est quelque chose que les documents que vous recommandé de le faire pour vous-même lorsque vous utilisez un Cursor simple, mais maintenant il est fait sous le capot.
  2. CursorLoader est mise à jour automatique. En plus d'effectuer la requête initiale, le CursorLoader enregistre un ContentObserver avec l'ensemble de données que vous avez demandé et appels forceLoad() sur lui-même lorsque les changements de jeu de données. Cela se traduit par vous obtenir callbacks async à tout moment les changements de données afin de mettre à jour la vue.

Chaque instance du chargeur est également gérée par le LoaderManager singulier, de sorte que vous n'avez pas encore à gérer le curseur directement, et maintenant la connexion peut persister même au-delà d'un seul Activity. LoaderManager.initLoader() et LoaderManager.restartLoader() vous permettent de reprendre contact avec un chargeur existant déjà établi pour votre requête et, dans certains cas, obtenir instantanément les dernières données si elle est disponible.

Votre activité ou fragmenter sera probablement mettre en œuvre maintenant l'interface LoaderManager.Callback. initLoader() L'appel se traduira par la méthode onCreateLoader () où vous construirez la requête et une nouvelle instance de CursorLoader, le cas échéant. La méthode de onLoadFinished() sera tiré chaque fois que de nouvelles données sont disponibles, et comprendra le dernier curseur pour vous attacher à la vue ou itérer autrement par.

En outre, il est un très bon exemple de tout cela assemblant sur la page de documentation de classe LoaderManager: http://developer.android.com/reference/android/app/LoaderManager.html

Hope qui aide!

Sur la base des réponses précédentes, je ne suis pas sûr que ce soit ce que vous demandez exactement. Mais oui, vous devez faire un chargeur avec son identifiant unique pour chaque ensemble de données à savoir chaque type de requête que vous effectuez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top