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


87

J'ai fait de la programmation de base de données SQLite pour Android, mais je ne sais rien sur Content-Provider sauf ceci: "Comme je l'ai mentionné la page des développeurs Android, Android SDK a expliqué le" 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. Quelle est la meilleure solution pour stocker des données, quand?

Tout exemple ou aide !!

Réponses:


134

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 y a une mise en garde dans les bases de données Android créées dans Android visibleuniquement pour l'application qui les a créées. C'est-à-dire qu'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 sur ce lien

Très belles informations fournies.


2
On dirait que le lien est mort maintenant ... ne voyez plus l'article. Voudrait voir l'article auquel vous faites référence si vous le retrouvez.
prolink007

le 11 février 2012, le lien http://www.devx.com/wireless/Article/41133 fonctionne,
k3b

Et si nous fournissons des mécanismes dans le processus pour partager les données entre plusieurs applications de manière thread-safe?
Manohar

2
Un autre avantage supplémentaire est que les fournisseurs de contenu utilisent un seul thread pour chaque opération, de sorte que plusieurs threads ne peuvent pas modifier la base de données comme dans un cas sqlite
Rat-a-tat-a-tat Ratatouille

54

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

ContentProviderest 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é de manière à ce que les données soient stockées dans une base de données SQLite, mais ce n'est pas obligatoire.

Quelle est la meilleure solution pour stocker des données, quand?

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


26
Je préfère utiliser un ContentProvider car c'est une très belle abstraction sur SQL. Vous pouvez également jouer gentiment avec CursorAdapter et les requeries automatiques.
alexanderblom

26

J'ai créé de nombreuses bonnes applications avec des milliers d'utilisateurs qui utilisaient simplement des méthodes SQLite. Mais c'était il y a quelque 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 favorable à l'utilisation de fournisseurs de contenu, car cela ne faisait qu'ajouter de la complexité au code.

Cependant, au cours des dernières années, au fur et à mesure qu'Android a évolué, je suis passé à ContentProvider car cela vous fait gagner du temps et vous permet d'en faire plus. Je l'utilise maintenant beaucoup. Une fois que vous avez rédigé un cours de fournisseur de contenu, 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 dans le passé et cela ne fonctionnait toujours pas aussi efficacement. Surtout lors de la mise à jour de la vue de liste, 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 besoin de m'inquiéter de l'ouverture et de la fermeture des bases de données ou des fuites de mémoire. Tout cela 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 faire des requêtes complexes dans ContentProviders. Dans ce cas, vous pouvez toujours utiliser des requêtes brutes et utiliser l'interaction manuelle à l'ancienne 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 perdre de temps à tout convertir en ContentProvider. Mais sur la base de mon expérience, je recommande vivement de passer à ContentProvider. Il faudra du temps pour s'y habituer, mais une fois que vous en aurez l'expérience, vous resterez avec.

MISE À JOUR 2017 Je suis maintenant passé à Realm , une bien meilleure façon d'utiliser les bases de données sur n'importe quelle plate-forme. Passez quelques heures à l'apprendre et gagnez d'innombrables heures dans votre carrière de développement d'applications.


Je pensais convertir mon code en fournisseur de contenu mais maintenant je pense le garder.
Mohammed Subhi Sheikh Quroush

Maintenant, vous pouvez également ajouter la bibliothèque 'Room' d'Android
Ravindra Kushwaha

8

1. Les fournisseurs de contenu ne sont pas sûrs pour les threads

Par défaut, les fournisseurs de contenu ne sont pas thread-safe. 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é synchronized sur chacune des méthodes publiques exposées par le fournisseur de contenu.

De cette manière, un seul thread à la fois peut accéder à ces méthodes.

2. Jouez bien lorsque vous écrivez beaucoup

J'ai le besoin 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 bien avec le reste de l'application, il est préférable de:

Créez un nouveau thread pour entreprendre l'importation afin que les autres threads ne soient pas affectés, 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 à partir d'endroits 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 que 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 manière 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 des requêtes alternatives et en accédant 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.


selon ContentProvider, six méthodes abstraites de ContentProvider qui doivent être implémentées peuvent être appelées par plusieurs threads à la fois, elles doivent donc être implémentées comme thread-safe. La classe abstraite ContentProvider n'est pas la raison des exceptions d'un code particulier mais l'implémentation. Suivez Processus et Threads pour implémenter les méthodes thread-safe de ContentProvider.
StahlRat

5

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

Si vous avez une base de données attaché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


3

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


3

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

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 ContentProvider, vous pouvez 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 gâcher 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

Pensez aux systèmes de gestion de contenu avancés. Chaque objet (page, image, article d'actualité, élément d'é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 traiter ces objets lorsque vous les ouvrez à partir de toute autre application.


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.