web-dev-qa-db-fra.com

Quelle est la différence entre contentprovider et contentResolver dans Android

Quelle est la différence entre ContentProviders et ContentResolver ? Je ne veux pas pour la base de données SQLite. Je développe une application pour les médias. 

32
Akshay Mukadam

J'ai trouvé une explication ici . En résumé

Content Resolver résout un URI en un fournisseur Content spécifique.

Content Provider fournit une interface pour interroger le contenu.

La façon d'interroger un fournisseur de contenu est contentResolverInstance.query(URI,.....)

46
user1700184

ContentProviders sont utilisés pour extraire la base de données d'autres parties et sert d'interface entre votre base de données et l'interface utilisateur/les autres classes. Vous devez créer votre propre ContentProvider pour partager vos données d'application avec d'autres applications.

ContentResolver est utilisé pour sélectionner le bon fournisseur de contenu basé sur ContentUris. Un ContentUri peut ressembler à 

content: //com.Android.contacts/contacts/3

  • content: // est appelé schéma et indique qu'il s'agit d'un ContentUri.
  • com.Android.contacts est appelé autorité de contenu et ContentResolver l'utilise pour le résoudre en un fournisseur unique (dans ce cas, ContactProvider).
  • contacts est le chemin qui identifie un sous-ensemble des données du fournisseur (par exemple, Nom de la table).
  • 3 est le id utilisé pour identifier de manière unique une ligne dans le sous-ensemble de données.

 enter image description here

REMARQUE: Votre propre application peut également utiliser cette route pour gérer ses données.

Voir Fournisseurs de contenu sous Android pour plus de détails

23
Siva Prakash

Abstraction en deux couches:

ContentResolver -> ContentProvider -> SQLiteDatabase

La principale différence est la même que celle mentionnée dans d'autres réponses. 

ContentProvider expose les données privées de votre application à des applications externes
tandis que
ContentResolver fournit le bon ContentProvider parmi tous les ContentProviders utilisant un URI.

Compréhension plus profonde (de l'abstraction à deux couches)

Faisons un détour.
Nous savons tous que lorsque nous créons une base de données SQLite, celle-ci reste privée pour votre application, ce qui signifie que vous ne pouvez simplement pas partager les données de votre application avec une autre application externe. 

Comment les données sont partagées alors?

ContentProvider et ContentResolver font partie du package Android.content. Ces deux classes fonctionnent ensemble pour fournir un modèle de partage de données robuste et sécurisé entre les applications.
ContentProvider expose les données stockées dans la base de données SQLite à une autre application sans leur indiquer l'implémentation sous-jacente de votre base de données.
Donc, il résume la base de données SQliteDatabase. Mais attendez il y a un piège !!!
L’application externe ne peut pas accéder directement à ContentProvider. Pour cela, vous devez d'abord interagir avec une autre classe appelée ContentResolver Pensez ContentResolver en tant que ContentProvider Finder. Il en existe une seule instance et tous les fournisseurs de contenu de votre appareil sont enregistrés avec un simple URI d'espace de noms. Si vous souhaitez atteindre un fournisseur de contenu donné, il vous suffit de connaître son adresse URI. Passez-le à ContentResolver et il trouvera le fournisseur utilisant l'URI.
Regardons maintenant la méthode la plus importantegetContentResolver().query(URI,String[] proj.....)

Que se passe-t-il lorsque getContentResolver().query(URI,String[] proj.....) est appelé

La méthode query() appartient à la classe ContentResolver, mais elle invoque la méthode abstraite query () de ContentProvider résolu et renvoie l'objet Cursor.
De cette manière, l'application externe est exposée à la base de données privée via deux couches d'abstraction. 

Juste pour ajouter plus de points
Vous ne pouvez pas créer votre propre classe ContentResolver, mais vous pouvez toujours créer votre propre Classe ContentProvider

J'espère que vous avez une meilleure compréhension
Vous pouvez également voir un exemple de code ici pour la création de SQLitedatabase, ContentProvider, etc., mais il n’est pas bien documenté. 

6
Rohit Singh

Soyez en retard que jamais. J'ai trouvé une bonne explication pratique. Le démontrer

Supposons que vous souhaitiez retirer de l'argent d'une banque. Vous devrez suivre les étapes suivantes

Caissier dans ABC Bank (Content Resolver) -> Passerelle ABC Bank (Fournisseur de contenu) -> Bank Server (Database).

Ci-dessus, le caissier ne connaît ni la mise en œuvre de la passerelle bancaire, ni sa base de données

De la même manière, le résolveur de contenu interroge le fournisseur de contenu et ContentProvider expose les données stockées dans la base de données SQLite à une autre application sans informer de l'implémentation de votre base de données.

0
Tarun