Quand utiliser un fournisseur de contenu


103

Je comprends que les fournisseurs de contenu sont conçus pour permettre le partage public de données entre les applications. Cependant, je me demande si quelqu'un a des idées sur la création d'un fournisseur de contenu à utiliser uniquement dans votre propre application. Y aurait-il des avantages à faire cela? Des inconvénients?

Dans le passé, je viens d'implémenter SQliteOpenHelper pour accéder aux données de ma base de données, mais j'envisage de créer un fournisseur de contenu. J'ai l'impression que l'approche URI pour demander des données est claire et concise. D'autre part, l'utilisation d'un fournisseur de contenu uniquement pour mon application sera-t-elle redondante (puisque j'aurai en son sein une classe SQliteOpenHelper) et plus de travail que nécessaire?


2
J'ai créé une bibliothèque pour rendre le fournisseur de contenu facile à écrire. Encore plus facile que d'écrire SQLiteOpenHelper. github.com/coocood/VContentProvider
coocood

Réponses:


59

Si vous ne prévoyez pas de partager des données, ne pensez pas aux fournisseurs de contenu. Ils sont puissants mais difficiles à écrire et il sera juste ridicule de les implémenter si vous comptez les utiliser en interne.

Cependant, je me demande si quelqu'un a des idées sur la création d'un fournisseur de contenu à utiliser uniquement dans votre propre application.

Bien sûr ... par exemple, pour une ancienne application de liste TODO que j'ai écrite, j'ai dû écrire un fournisseur de contenu pour permettre à d'autres applications de récupérer et d'accéder aux états des tâches. Cela faisait partie des exigences, mais plus que cela, cela avait du sens et rendait l'application plus agréable.


35
Je suis d'accord avec votre justification, mais je pense également qu'il est important (en particulier pour les débutants) qu'une fois le fournisseur de contenu implémenté, vous bénéficiez de nombreux avantages. Par exemple, vous pouvez utiliser le CursorLoaderpour effectuer des requêtes asynchrones ... vous avez accès à une instance singleton (le ContentResolver) pour effectuer des requêtes, etc. pourrait implémenter l'accès à une seule instance de base de données sur l'ensemble de l'application ... et bien sûr, un ContentProvider n'est pas nécessaire sauf si vous souhaitez partager
Alex Lockwood

12
données avec d'autres applications. Cela dit, la mise en œuvre de votre propre fournisseur de contenu présente de nombreux avantages, vous ne devriez donc pas le laisser tomber simplement parce que votre application ne partage pas ses données.
Alex Lockwood

8
Oui, vous avez tout à fait raison, mais je pense toujours que cela ne vaut pas la peine dans la plupart des cas. J'ai créé au moins 12 applications Android différentes (publiées sur le Play Store) et je n'ai jamais eu besoin d'un ContentProvider. En fait, la dernière application sur laquelle nous travaillions a été initialement créée avec a ContentProvideret nous venons de la supprimer car elle est en fait plus pénible à utiliser qu'elle ne le devrait (j'ai même écrit une bibliothèque pour faciliter l'implémentation de ContentProviders de base : github.com/casidiablo/persistence mais je ne l'ai jamais utilisé moi-même XD).
Cristian

1
@Cristian fournit les conseils les plus pratiques. Même le document Android indique que nous ne devrions pas utiliser ContentProvidersi nous n'en avons pas besoin - "Vous n'avez pas besoin d'un fournisseur pour utiliser des bases de données ou d'autres types de stockage persistant si l'utilisation se fait entièrement dans votre propre application et que vous n'avez pas besoin l'une des fonctionnalités répertoriées ci-dessus. À la place, vous pouvez utiliser l'un des systèmes de stockage décrits sur la page Enregistrement des données d'application. ". Sinon, nous sommes juste au-dessus de l'ingénierie.
Cheok Yan Cheng

Résumé: Si vous ne prévoyez pas de partager vos données, vous pouvez éviter le fournisseur de contenu, mais d'un autre côté, le fournisseur de contenu vous facilite la vie si vous souhaitez modifier la base de données de votre application. par exemple de SQLite à MangoDB.
Prashant

117

Je dirais que c'est certainement une bonne idée d'utiliser un ContentProvidermême si vous n'avez pas l'intention de le rendre public.

Il est recommandé de fournir un niveau d'abstraction supplémentaire sur vos données pour faciliter le changement en interne. Que faire si vous décidez de modifier ultérieurement la structure de la base de données sous-jacente? Si vous utilisez un, ContentProvidervous pouvez contenir toutes les modifications structurelles, alors que, comme si vous n'en utilisiez pas, vous êtes obligé de modifier toutes les zones du code qui sont affectées par les modifications structurelles. En outre, il est agréable de pouvoir réutiliser la même API standard pour accéder aux données plutôt que de gâcher votre code avec un accès de bas niveau à la base de données.

De plus, il est toujours possible que vous souhaitiez exposer vos données à l'avenir. Si vous n'utilisez pas un ContentProviderà l'avant, il sera beaucoup plus difficile de le moderniser à une date ultérieure.

Ensuite, il y a les autres parties de l'Android où ContentProviderles éléments sont requis / recommandés, par exemple lors de l'utilisation de SyncAdapters et si vous voulez un widget d'application qui implique l'accès aux données par exemple.

En résumé, il y a très peu de frais généraux impliqués dans l'écriture d'un ContentProviderdébut (une fois que vous avez appris l'API, ce qui est une bonne idée de toute façon), il est donc logique de le faire, même pour les données privées.


1
Je ne pourrais pas être plus d'accord. Cela vous oblige à abstraire votre couche de données d'une manière qui garantit pratiquement qu'un nouveau développeur ne pourra pas coupler l'interface utilisateur avec elle.
Gabriel

3
Immédiatement après avoir appris Android, j'ai commencé à penser exactement de la même manière pour cette raison. Même s'il n'est pas public, vous pouvez toujours bénéficier de l'abstraction accrue et du point unique de mise en œuvre de vos décisions architecturales. J'adore ContentProviders.
davidcsb

2
Vous pouvez rendre le fournisseur de contenu disponible uniquement pour votre propre application avec cet attribut:android:exported="false"
Toby 1 Kenobi

4
À mon humble avis, vous pouvez et devez gérer vos données de manière complètement abstraite, sans avoir à implémenter ContentProvider.
hmartinezd

2
Alors que j'étais en train d'implémenter une solution de fournisseur de contenu pour ma base de données sqlite interne (aucune interaction avec d'autres applications), j'ai vu la remarque sur developer.android.com/guide/topics/providers/… qui indique que vous n'avez pas besoin d'un fournisseur pour utiliser une base de données SQLite si l'utilisation se fait entièrement dans votre propre application.
Selçuk Cihan

7

Jetez un œil à MOTODEV Studio pour Eclipse. C'est un environnement de développement qui étend Eclipse. Ils ont un outil où vous pouvez générer automatiquement un fournisseur de contenu pour une base de données. Si un fournisseur de contenu facilite l'accès à vos données et que cela n'a pas d'impact significatif sur les performances, utilisez-le. Dans la plupart des scénarios, ce sera le cas.


5

En bref, Content Providersaide à gérer efficacement vos données . Je suggérerais de les utiliser pour les raisons suivantes.

  • Il agit comme une couche d'abstraction entre votre interface utilisateur et votre base de données . Vous pouvez implémenter la validation des données dans ContentProviders pour valider les données saisies par l'utilisateur. Il vous permet également de modifier la structure de la base de données sans toucher à l'interface utilisateur et aux autres parties.
  • Ils jouent bien avec d'autres classes de framework Android comme SyncAdapter. Par exemple, vous pouvez actualiser automatiquement une liste, lorsqu'une valeur dans une base de données change en utilisant ContentProviders avec CursorLoader. Sans ContentProviders, vous devez implémenter vous-même de nombreuses fonctionnalités comme celles-ci.
  • Nous pouvons exposer en toute sécurité nos données privées à d'autres applications . L'utilisation de ContentProviders nous permettra de partager nos données facilement et en toute sécurité avec d'autres applications.

Donc, même si vous n'avez besoin d'aucune de ces fonctionnalités maintenant, vous pourriez en avoir besoin à l'avenir et il est bon de faire un effort supplémentaire et de les implémenter dès maintenant.


Très bonne réponse. Description en une phrase ContentProviderset trois raisons distinctes pour lesquelles nous devrions les utiliser. Parfois, les explications simples sont les meilleures. +1
AdamInTheOculus

4

Je suis d'accord que les ContentProviders sont un peu difficiles à comprendre, mais ils sont vraiment utiles, même si vous souhaitez les utiliser en interne pour votre propre application. La meilleure chose à ce sujet est que vous pouvez personnaliser les fournisseurs de contenu pour les URI appropriés.

Voici un scénario où vous pouvez avoir 5 tables dans votre base de données, mais vous devez en joindre quelques-unes dans certaines commandes avant de les utiliser. Et créez un URI de contenu pour chacune de ces jointures. Vous pouvez alors chacun utiliser ces URI comme table :)

Je vous suggère d'aller de l'avant avec Content Provider, vous serez étonné de voir à quel point il est puissant.


2

À mon avis, le fournisseur de contenu présente de nombreux avantages, à part le simple partage de données avec d'autres applications. Si vous avez besoin de vous synchroniser avec le serveur à l'aide d'un adaptateur de synchronisation, utilisez la messagerie Google Cloud, mettez à jour automatiquement l'interface utilisateur lorsque les données sous-jacentes de la base de données changent à l'aide de Loaders, implémentez la recherche, utilisez des widgets ... alors le fournisseur de contenu est fait pour vous.

Je préfère que vous suiviez les instructions car un jour, vous devrez peut-être implémenter certaines des fonctionnalités ci-dessus attachées au fournisseur de contenu

En passant, vous pouvez rapidement créer votre base de données et votre CP en moins de 5 minutes à l'aide du générateur de fournisseur de contenu


1

Comme indiqué dans la documentation: création d'un fournisseur de contenu

Vous n'avez pas besoin d'un fournisseur pour utiliser une base de données SQLite si l'utilisation se fait entièrement dans votre propre application.

Alors pourquoi se donner la peine de développer ces frais généraux? Vous voulez un développement plus facile et plus rapide, non? Donc une couche d'abstraction (descendant de SQLiteOpenHelper) suffit.

Voir Rasoir d'Occam Ne créez pas d'entités sans une très bonne raison.


0

N'utilisez pas de fournisseur de contenu si vous ne souhaitez pas partager de données avec d'autres applications. Utilisez simple sqlitedatabase pour effectuer des opérations de base de données. Soyez prudent lorsque vous utilisez des fournisseurs de contenu pour stocker des données confidentielles, car vos informations confidentielles peuvent être consultées par d'autres applications


Par défaut, les fournisseurs de contenu ne sont pas exposés et la gestion des restrictions d'accès à ces derniers est facile. Votez contre la diffusion de la désinformation.
TBridges42

2
@ TBridges42 Vous vous êtes (aviez) tort. En fait, jusqu'à ce que les fournisseurs de contenu API de niveau 17 soient exposés . Et au moment de la réponse, 25% des appareils Android étaient concernés par ce comportement et encore 10% au moment de votre commentaire . Donc, c'est plutôt l'inverse: votre commentaire est dangereux, car vous énoncez quelque chose à sécuriser qui n'est / n'était pas le fait.
Murmel

0

L'utilisation d'un fournisseur de contenu peut vous aider à atteindre un niveau d'abstraction supplémentaire - En le plaçant dans votre propre application, vous augmentez considérablement le temps de développement de votre projet. Cependant, si vous l'utilisez pour partager des données, des paramètres d'application ou des configurations entre plusieurs applications, le fournisseur de contenu est votre choix.

Surveillez vos niveaux de sécurité et je recommanderais d'utiliser SQLcipher pour crypter les données à la réinitialisation (DAR) si votre fournisseur de contenu écrit sur SQLite. (J'ai utilisé un fournisseur de contenu dans quelques solutions et fourni la possibilité de prendre un «instantané» en direct des valeurs opérationnelles pour le débogage et les tests.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.