Les meilleures pratiques pour exposer plusieurs tables à l'aide des fournisseurs de contenus Android
Je suis en train de construire une application où j'ai une table et une table pour les sites. Je veux être en mesure d'accorder à d'autres applications d'accéder à ces données. J'ai quelques questions concernant les meilleures pratiques pour ce genre de problème.
-
Comment la structure de la base de données des classes?
J'ai actuellement des cours pour EventsDbAdapter et VenuesDbAdapter, qui fournissent la logique de l'interrogation de chaque table, tout en ayant un DbManager (s'étend SQLiteOpenHelper) pour la gestion des versions de base de données, création/mise à jour des bases de données donnant accès à la base de données (getWriteable/ReadeableDatabase). Est-ce la solution recommandée, ou serais-je mieux, soit la consolidation de tout ce qui à une classe (c'est à dire. le DbManager) ou de la séparation de tout et de laisser chaque Carte s'étend SQLiteOpenHelper? -
Comment dois-je de conception fournisseurs de contenu pour plusieurs tables?
L'extension de la précédente question, dois-je utiliser un Fournisseur de Contenu pour l'ensemble de l'application, ou devrais-je créer fournisseurs distincts pour les Événements et les Lieux?
La plupart des exemples que j'ai trouver seuls face à la seule table apps, donc j'apprécierais toute pointeurs ici.
Vous devez vous connecter pour publier un commentaire.
C'est probablement un peu tard pour vous, mais d'autres peuvent trouver cela utile.
Vous devez d'abord créer plusieurs CONTENT_URIs
Vous développez votre URI Matcher
Ensuite créer vos tables
N'oubliez pas d'ajouter le deuxième
DATABASE_CREATE
àonCreate()
Vous allez utiliser un cas de commutateur bloc de déterminer ce tableau est utilisé. C'est mon insérer le code
Vous aurez besoin de diviser le
delete
,update
,getType
, etc. Partout où votre fournisseur d'appels pour DATABASE_TABLE ou CONTENT_URI, vous allez ajouter un cas et ont DATABASE_TABLE1 ou CONTENT_URI1 dans l'un et n ° 2 dans la prochaine et ainsi de suite pour autant que vous le souhaitez.query
,queryUsers
,queryUser
,queryGroups
,queryGroup
C'est la façon dont les contacts intégrés fournisseur t-il. com.android.providers.contacts.ContactsProvider2.java github.com/android/platform_packages_providers_contactsprovider/...Je recommande de vérifier le code source d'Android 2.x ContactProvider. (Qui peut être trouvé en ligne). Ils ont la poignée de la croix de la table de requêtes par des services spécialisés de points de vue que vous, puis d'exécuter des requêtes sur l'extrémité arrière. Sur l'extrémité avant, ils sont accessibles à l'appelant par l'intermédiaire de divers différents Uri, grâce à un seul fournisseur de contenu. Vous voudrez aussi de fournir une classe ou deux pour la tenue des constantes pour votre table de noms de champ et les chaînes URI. Ces classes pourraient être fournis, soit de l'API de l'inclure ou comme une goutte d'eau dans la classe, et il sera beaucoup plus facile pour les consommateurs de l'application à utiliser.
Son un peu complexe, de sorte que vous pourriez également vouloir vérifier comment le calendrier pour avoir une idée de ce que vous faites et n'ont pas besoin.
Vous devriez seulement besoin d'un seul adaptateur DB et un seul fournisseur de Contenu par base de données (pas par table) pour faire le gros du travail, mais vous pouvez utiliser plusieurs adaptateurs/fournisseurs si vous le voulez vraiment. Il rend juste les choses un peu plus compliquées.
switch
solution, mais cette partie que vous avez mentionné :They handle cross table queries by providing specialized views that you then run queries against on the back end. On the front end they are accessible to the caller via various different URIs through a single content provider
. Pourriez-vous expliquer cela un peu plus en détail?Un
ContentProvider
peut servir à de multiples tables, mais ils devraient être quelque peu liés. Il fera une différence si vous avez l'intention de synchroniser vos fournisseurs. Si vous voulez séparer les synchronisations pour, disons, les Contacts, la Messagerie ou le Calendrier, vous aurez besoin de différents fournisseurs pour chacun d'eux, même s'ils finissent par être dans la même base de données ou sont synchronisés avec le même service, en raison de la Synchronisation des Adaptateurs sont directement liés à un fournisseur particulier.Aussi loin que je peux dire, vous ne pouvez utiliser qu'un seul SQLiteOpenHelper par base de données, car il stocke ses des méta-informations dans une table dans la base de données. Donc, si votre
ContentProviders
accéder à la même base de données, vous aurez à part l'aide somewhow.Note: C'est une clarification et/ou de modification de la réponse de fournir par Opia.
Cette approche divise chacun des
insert
,delete
,update
, etgetType
méthodes avec les instructions switch pour gérer chacun de vos tables. Vous utiliserez un CAS à identifier chaque table (ou uri) pour la référence. Chaque CAS correspond à un de vos tables ou de URI. E. g., TABLE1 ou URI1 est sélectionné dans le CAS n ° 1, etc. pour toutes les tables de votre application utilise.Voici un exemple de l'approche. C'est pour la méthode d'insertion. Il a mis en œuvre un peu différemment de Opia mais remplit la même fonction. Vous pouvez sélectionner le style que vous préférez. Je voulais aussi assurez-vous d'insérer renvoie une valeur, même si l'insertion de la table échoue. Dans ce cas, elle renvoie un
-1
.J'ai trouvé la meilleure démonstration et explication pour ContentProvider et je pense qu'il a suivie Android Normes.
Contrat Classes
et les Classes internes:
Maintenant la création de la Base de données à l'aide de SQLiteOpenHelper:
Fournisseur De Contenu:
J'espère que ça vous aide.
Démo sur GitHub: https://github.com/androidessence/MovieDatabase
Article Complet : https://guides.codepath.com/android/creating-content-providers
Références:
http://code.tutsplus.com/tutorials/android-sdk_content-providers--mobile-5549
http://www.grokkingandroid.com/android-tutorial-writing-your-own-content-provider/
http://developer.android.com/guide/topics/providers/content-providers.html
https://thenewcircle.com/s/post/1375/android_content_provider_tutorial
http://www.grokkingandroid.com/android-tutorial-content-provider-basics/
http://androidessence.com/
Note : j'ai copié le code tout simplement parce que si le lien de démo ou de l'article peut être supprimer à l'avenir.