web-dev-qa-db-fra.com

Différence exacte entre "Content-Provider" et "SQLite Database"

j'ai fait la programmation de base de données SQLite pour Android, mais je ne sais rien de Content-Provider sauf ceci: "Comme je l'ai mentionné page développeur Android , Android SDK expliqué sur "Content-provider" car il est utilisé pour stocker et récupérer des données. "

Mais alors,

  1. Quelle est la différence exacte entre "Content-Provider" et "SQLite Database"?
  2. Quel est le meilleur moyen de stocker des données, quand?

N'importe quel exemple ou aide !!

84
Paresh Mayani

J'ai trouvé une différence majeure, comme suit:

Le stockage de vos données dans une base de données est un bon moyen de conserver vos données , mais il existe une mise en garde dans les bases de données Android créées dans Android sont visible uniquement pour l'application qui les a créés. C'est-à-dire une base de données SQLite créée sur Android par une application n'est utilisable que par cette application, pas par d'autres applications.

Donc, si vous need to share data between applications, you need to use the content provider model as recommended in Android. Cet article présente les bases des fournisseurs de contenu et comment vous pouvez en implémenter un.

J'ai trouvé cet article à ce lien

Vraiment de belles informations fournies.

132
Paresh Mayani

Quelle est la différence exacte entre "Content-Provider" et "SQLite Database"?

ContentProvider est une façade - une API que vous pouvez implémenter qui expose les bases de données à d'autres processus. Il peut être implémenté d'une manière où les données sont stockées dans une base de données SQLite, mais ce n'est pas obligatoire.

Quel est le meilleur moyen de stocker des données, quand?

Il est impossible de répondre dans l'abstrait. D'une manière générale, à moins que quelque chose ne vous oblige à utiliser un ContentProvider, utilisez simplement une base de données.

53
CommonsWare

J'ai créé de nombreuses bonnes applications avec des milliers d'utilisateurs qui les utilisent simplement en utilisant des méthodes SQLite. Mais c'était il y a un certain temps et j'ai dû écrire manuellement beaucoup de code qui peut maintenant être facilement pris en charge par ContentProvider. À l'époque, je n'étais pas en faveur de l'utilisation de fournisseurs de contenu, car cela ne faisait qu'ajouter de la complexité au code.

Cependant, depuis quelques années, comme Android a évolué, je suis passé à ContentProvider car cela fait gagner du temps et vous permet d'en faire plus. Je l'utilise maintenant largement. Une fois que vous avez une classe Content Provider écrit, votre vie devient beaucoup plus facile. Avec ContentProvider, je peux très facilement gérer les chargeurs de curseur, les rappels de chargeur et les insertions en masse pour lesquels j'ai dû tout écrire manuellement par le passé et cela ne fonctionnait toujours pas aussi efficacement. Surtout lors de la mise à jour de la liste vue, qui est désormais automatiquement mise à jour grâce à une seule méthode notifychange (). Cela signifie que je n'ai plus à taper mes propres écouteurs et à mettre à jour manuellement le contenu dans les vues de liste et les adaptateurs. De plus, je n'ai pas à me soucier de l'ouverture et la fermeture de bases de données ou des soucis de fuites de mémoire. Tout est géré par le fournisseur de contenu. Le seul problème auquel je suis confronté de temps en temps est que vous ne pouvez pas effectuer de requêtes complexes dans ContentProviders. Dans ce cas, vous pouvez toujours utiliser des requêtes brutes et utiliser l'ancienne interaction manuelle avec sqlite.

Si vous avez déjà écrit vos propres DbAdapter, Helper et Observer, vous pouvez les transférer en toute sécurité vers vos nouvelles applications sans passer du temps à tout convertir en ContentProvider. Mais d'après mon expérience, je recommanderais fortement de passer à ContentProvider. Il faudra un certain temps pour s'y habituer, mais une fois que vous en aurez fait l'expérience, vous y resterez.

PDATE 2017 Je suis maintenant passé à Realm , une bien meilleure façon d'utiliser des bases de données sur n'importe quel Plate-forme. Passez quelques heures à l'apprendre et économisez d'innombrables heures dans votre carrière de développement d'applications.

23
zeeshan

1. Les fournisseurs de contenu ne sont pas Thread Safe

Par défaut, les fournisseurs de contenu ne sont pas sûrs pour les threads. Si vous avez plusieurs threads utilisant un fournisseur de contenu, vous pouvez voir de nombreuses exceptions différentes levées et d'autres incohérences de données. Le moyen le plus simple de résoudre ce problème consiste à utiliser le mot clé synchronisé sur chacune des méthodes publiques exposées par le fournisseur de contenu.

De cette façon, un seul thread à la fois peut accéder à ces méthodes.

2. Jouez à Nice en faisant beaucoup d'écritures

J'ai la nécessité dans la nouvelle application Serval Maps d'importer des données de fichiers binaires dans la base de données utilisée en interne par l'application. Pour ce faire et jouer à Nice avec le reste de l'application, il est préférable de:

Générez un nouveau thread pour entreprendre l'importation afin que les autres threads ne soient pas affectés négativement, en particulier le thread en charge de la mise à jour de l'interface utilisateur; et Pause brièvement à la fin de chaque importation pour donner plus de chance aux autres threads qui ont besoin d'utiliser les méthodes synchronisées.

3. Les fournisseurs de contenu vous obligent parfois à penser latéralement

La façon dont les fournisseurs de contenu dans Android fonctionnent est de fournir une couche d'abstraction entre le reste de votre code et la base de données sous-jacente. Cela est principalement dû au fait, pour autant que je sache, que les fournisseurs de contenu peuvent accéder aux données depuis des emplacements autres que les bases de données.

Cela signifie que vous ne pouvez pas exécuter de requêtes SQL brutes sur la base de données sous-jacente et vous devez spécifier les différents composants d'une requête SQL à l'aide de variables transmises aux différentes méthodes telles que la méthode de requête. Si vous avez une tâche qui ne correspond pas à la façon dont SQL est géré par un fournisseur de contenu, vous avez deux options:

Pensez latéralement à la requête, vous pouvez peut-être obtenir les données dont vous avez besoin par d'autres requêtes et accéder aux résultats à partir du curseur; et Utilisez un URI pour accéder aux données normalement et un URI spécial qui correspond à une requête spécifique pour les tâches qui n'ont pas d'alternatives.

8
chanu

Les fournisseurs de contenu sont utilisés lorsque vous souhaitez partager vos données entre plusieurs applications.

Si une base de données est associée à une application et que vous souhaitez qu'une autre application utilise certaines données, vous pouvez implémenter un fournisseur de contenu qui expose les données

5
Mina Samy

Pensez aux systèmes avancés de gestion de contenu. Chaque objet (page, image, article de presse, événement, etc.) a un contenu, une adresse, des autorisations utilisateur et des moyens d'interagir avec lui à partir de différentes parties du système. Les fournisseurs de contenu le font pour Android. Vous pouvez désormais partager des fichiers ou des images que vous avez peut-être stockés dans votre application. Vous pouvez également créer des objets partageables personnalisés, tels que des contacts commerciaux, des notes modifiables, etc. Et spécifier la sécurité et l'application par défaut pour gérer cet objet lorsque vous les ouvrez à partir de toute autre application.

3
Roberto

J'ai lu cette réponse tout en recherchant le même doute, alors j'ai pensé à le partager. il est dit -

Il est recommandé de fournir un niveau d'abstraction supplémentaire sur vos données pour faciliter les modifications internes. Que faire si vous décidez de modifier la structure de la base de données sous-jacente ultérieurement? Si vous utilisez un ContentProvider, vous pouvez y contenir toutes les modifications structurelles, où 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 jeter votre code avec un accès de bas niveau à la base de données.

Donc, utiliser un fournisseur de contenu serait une bonne idée.

3
Darpan

La principale différence est la suivante: lorsque votre application doit partager des informations avec une autre application, utilisez Content-Provider. Données de stockage SQLite uniquement pour l'application qui les crée

3
daniel uribe ayvar

Une différence est que les fournisseurs de contenu prennent en charge la plate-forme pour les observateurs de contenu. Vous devrez implémenter votre propre modèle observable pour une base de données SQLite.

Comment réinterroger automatiquement avec LoaderManager

ContentObserver pour SQLite?

1
user1538028