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 ?
Réponses
Trop de publicités?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.
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édiaireContentProvider
, et pas les applications doivent être à l'aide d'unContentProvider
purement à des fins internes.Cela étant dit, vous avez un peu de choix:
Ne pas utiliser de Chambre, au moins pour les tables à être exposé via l'
ContentProvider
Salle d'utilisation à des fins internes, mais alors utiliser les classiques SQLite techniques de programmation pour l'
ContentProvider
, en appelantgetOpenHelper()
sur votreRoomDatabase
L'utilisation de la Salle dans l'
ContentProvider
, d'écrire votre propre code pour construire unMatrixCursor
de la Chambre des entités que vous récupérer (pourquery()
) ou la création d'entités pour une utilisation avec d'autres opérations (parinsert()
,update()
,delete()
, etc.)
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).
Plus d'informations sur Kripton sur son wiki, mon site et sur mes articles .
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.
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? {
}
}