69 votes

Bibliothèque de persistance de salle et fournisseur de contenu

Depuis Quelques jours j'ai passé du temps sur l'apprentissage de nouveaux Android des Composants de l'Architecture . À la suite de certains articles de blog, de documentation et des tutoriels , tous les composants ont été prise en clair pour moi . Mais tout à coup j'ai réalisé qu'en est notre vieil ami Fournisseur de Contenu . Je peut paraître stupide , car avant la rédaction de cette question que j'ai passé assez de temps à chercher , Suis-je le seul qui est venu avec cette question . Je n'avais pas obtenu une solution utile . De toute façon ici c'est , si je veux construire une application avec de la bd locale , maintenant, je vais bien évidemment choisir de nouveaux Composants de l'Architecture (données en direct , vue du modèle , de la salle ) sans plus de réflexion, ce sera très utile de faire application 10x robuste . Mais Si je veux que ma DB données accessibles à d'autres applications , par exemple De Widget Comment puis-je intégrer Fournisseur de Contenu avec Chambre ?

46voto

Mark Points 573

J'ai eu la même question par la voie. Et j'ai trouvé un exemple ici qui répond à ma question. Espérons qu'il en fait de même avec vous.

En bref, c'est dans l'objet de DAO qui serait appelée à partir du Fournisseur de Contenu, query() méthode.

/**
 * Select all cheeses.
 *
 * @return A {@link Cursor} of all the cheeses in the table.
 */
@Query("SELECT * FROM " + Cheese.TABLE_NAME)
Cursor selectAll();

Remarquez comment il retourne Cursor objet. D'autres opérations, vous pouvez voir par vous-même plus en détail dans l'échantillon.

Ce ici est le choix numéro 3 de la réponse par @CommonsWare, je pense.

14voto

CommonsWare Points 402670

si je veux construire une application avec de la bd locale , maintenant, je vais bien évidemment choisir de nouveaux Composants de l'Architecture (données en direct , vue du modèle , de la salle )

Je ne voudrais pas utiliser le terme "manifestement" il. Les Composants de l'Architecture sont une option, mais une obligation.

Mais Si je veux que ma DB données accessibles à d'autres applications , par exemple De Widget Comment puis-je intégrer Fournisseur de Contenu avec Chambre ?

Une application widget est pas lié à un ContentProvider. À mon humble avis, très peu d' applications doivent être d'exposer les bases de données à des tiers par l'intermédiaire ContentProvider, et pas les applications doivent être à l'aide d'un ContentProvider purement à des fins internes.

Cela étant dit, vous avez un peu de choix:

  1. Ne pas utiliser de Chambre, au moins pour les tables à être exposé via l' ContentProvider

  2. Salle d'utilisation à des fins internes, mais alors utiliser les classiques SQLite techniques de programmation pour l' ContentProvider, en appelant getOpenHelper() sur votre RoomDatabase

  3. L'utilisation de la Salle dans l' ContentProvider, d'écrire votre propre code pour construire un MatrixCursor de la Chambre des entités que vous récupérer (pour query()) ou la création d'entités pour une utilisation avec d'autres opérations (par insert(), update(), delete(), etc.)

8voto

xcesco Points 896

Salle de Bibliothèque n'a pas de soutien particulier pour le Fournisseur de Contenu. Vous ne pouvez écrire que Fournisseur de Contenu sur votre propre et d'utilisation de la Salle pour interroger une base de données.

Si vous souhaitez utiliser Android des Composants de l'Architecture, et vous voulez travailler avec SQLite base de Fournisseurs de Contenu, pensez à utiliser Kripton Persistance de la Bibliothèque: elle permet de générer des Données en Direct à partir de requêtes DB, générer Fournisseur de Contenu pour vous, et bien plus encore. Moins mais pas le dernier: pourquoi avez-vous d'écrire l'ensemble de SQL, lorsque vous avez besoin seulement d'écrire le où en sont les conditions?

Juste pour être clair, je suis l'auteur de Kripton Persistance de la Bibliothèque. Je l'ai écrit parce que je n'ai pas trouvé une bibliothèque unique qui correspondent à tous mes besoins en termes de persistance de gestion (et oui, parce que j'aime le programme).

J'ai écrit une version convertie de Google Fournisseur de Contenu de l'Échantillon avec Kripton. Vous pouvez trouvé ici.

Juste pour simplifier la lecture. Avec Kripton, vous avez seulement besoin de définir une interface DAO. Fournisseur de contenu est généré par les annotations. La même DAO converti en Kripton sera:

@BindContentProviderPath(path = "cheese")
@BindDao(Cheese.class)
public interface CheeseDao {

    @BindSqlSelect(fields="count(*)")
    int count();

    @BindContentProviderEntry
    @BindSqlInsert
    long insert(String name);

    @BindContentProviderEntry()
    @BindSqlSelect
    List<Cheese> selectAll();

    @BindContentProviderEntry(path = "${id}")
    @BindSqlSelect(where ="id=${id}")
    Cheese selectById(long id);

    @BindContentProviderEntry(path = "${id}")
    @BindSqlDelete(where ="id=${id}")
    int deleteById(long id);

    @BindContentProviderEntry(path = "${cheese.id}")
    @BindSqlUpdate(where="id=${cheese.id}")
    int update(Cheese cheese);

}

Le Contenu généré Fournisseur expose DAO de la méthode avec les Uri. Pour clearification, je l'ai mis ici que les générées JavaDoc (toujours par Kripton).

enter image description here

Plus d'informations sur Kripton sur son wiki, mon site et sur mes articles .

7voto

Aleksei Mulin Points 67

Post tardif mais je suis tombé sur le même numéro récemment. Finalement, nous avons fini par utiliser la même instance de base de données de salles à la fois pour le fournisseur local et le fournisseur de contenu.

entrez la description de l'image ici

Donc, l'application elle-même utilise Room Database comme d'habitude et le fournisseur de contenu "enveloppe" la base de données avec "helper ouvert" comme suit:

 class DatabaseProvider : ContentProvider() {

    override fun onCreate(): Boolean {
        return true
    }

    override fun query(uri: Uri?, projection: Array<out String?>?, selection: String?, selectionArgs: Array<out String?>?, sortOrder: String?): Cursor? {
        val db = roomDatabase.openHelper.readableDatabase
        db.query(...)
    }

    override fun insert(uri: Uri?, values: ContentValues?): Uri? {
        val db = roomDatabase.openHelper.writableDatabase
        db.insert(...)
    }

    override fun update(uri: Uri?, values: ContentValues?, selection: String?, selectionArgs: Array<out String?>?): Int {
        val db = roomDatabase.openHelper.writableDatabase
        db.update(...)
    }

    override fun delete(uri: Uri?, selection: String?, selectionArgs: Array<out String?>?): Int {
        val db = roomDatabase.openHelper.writableDatabase
        db.delete(...)
    }

    override fun getType(uri: Uri?): String? {
    }
}
 

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