Je construis une application où j'ai une table pour les événements et une table pour les lieux. Je souhaite pouvoir autoriser d'autres applications à accéder à ces données. J'ai quelques questions relatives aux meilleures pratiques pour ce genre de problème.
Comment dois-je structurer les classes de base de données? J'ai actuellement des classes pour EventsDbAdapter et VenuesDbAdapter, qui fournissent la logique d'interrogation de chaque table, tout en ayant un DbManager séparé (étend SQLiteOpenHelper) pour gérer les versions de base de données, créer / mettre à niveau les bases de données, donnant accès à la base de données (getWriteable / ReadeableDatabase). Est-ce la solution recommandée, ou est-ce que je ferais mieux de tout consolider dans une seule classe (c'est-à-dire le DbManager) ou de tout séparer et de laisser chaque adaptateur étendre SQLiteOpenHelper?
Comment dois-je concevoir des fournisseurs de contenu pour plusieurs tables? En prolongeant la question précédente, dois-je utiliser un seul fournisseur de contenu pour l'ensemble de l'application ou dois-je créer des fournisseurs distincts pour les événements et les lieux?
La plupart des exemples que je trouve ne concernent que des applications à table unique, donc j'apprécierais tous les pointeurs ici.
la source
query
,queryUsers
,queryUser
,queryGroups
,queryGroup
Voici comment le fournisseur intégré contacts fait. com.android.providers.contacts.ContactsProvider2.java github.com/android/platform_packages_providers_contactsprovider/…Je recommande de consulter le code source du fournisseur de contact Android 2.x. (Qui peut être trouvé en ligne). Ils gèrent les requêtes entre tables en fournissant des vues spécialisées sur lesquelles vous exécutez ensuite des requêtes sur le serveur principal. Sur le front-end, ils sont accessibles à l'appelant via différents URI différents via un seul fournisseur de contenu. Vous voudrez probablement également fournir une classe ou deux pour contenir des constantes pour vos noms de champs de table et vos chaînes URI. Ces classes peuvent être fournies soit en tant qu'inclusion API, soit en tant que classe supplémentaire, et faciliteront considérablement l'utilisation de l'application consommatrice.
C'est un peu complexe, vous voudrez peut-être également vérifier comment le calendrier vous permet de vous faire une idée de ce que vous faites et de ce dont vous n'avez pas besoin.
Vous ne devriez avoir besoin que d'un seul adaptateur de base de données et d'un seul fournisseur de contenu par base de données (et non par table) pour effectuer la plupart du travail, mais vous pouvez utiliser plusieurs adaptateurs / fournisseurs si vous le souhaitez vraiment. Cela rend les choses un peu plus compliquées.
la source
switch
solution, mais cette partie vous dit: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
. Pensez-vous pouvoir expliquer cela un peu plus en détail?Une
ContentProvider
peut servir plusieurs tables, mais elles devraient être quelque peu liées. Cela fera une différence si vous avez l'intention de synchroniser vos fournisseurs. Si vous voulez des synchronisations séparées pour, disons Contacts, Mail ou 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, car les adaptateurs de synchronisation sont directement liés à un fournisseur particulier.Pour autant que je sache, vous ne pouvez utiliser qu'un seul SQLiteOpenHelper par base de données, car il stocke ses méta-informations dans une table de la base de données. Donc, si vous
ContentProviders
accédez à la même base de données, vous devrez partager le Helper quelque part.la source
Remarque: Ceci est une clarification / modification de la réponse fournie par Opy.
Cette approche subdivisant chacun des
insert
,delete
,update
, et lesgetType
méthodes avec les déclarations de commutation afin de traiter chacun de vos tables individuelles. Vous utiliserez un CASE pour identifier chaque table (ou uri) à référencer. Chaque CASE correspond ensuite à l'une de vos tables ou URI. Par exemple, TABLE1 ou URI1 est sélectionné dans CAS N ° 1, etc. pour toutes les tables que votre application utilise.Voici un exemple de l'approche. Ceci est pour la méthode d'insertion. Il est implémenté un peu différemment d'Opy mais remplit la même fonction. Vous pouvez sélectionner le style que vous préférez. Je voulais également m'assurer que l'insertion renvoie une valeur même si l'insertion de la table échoue. Dans ce cas, il renvoie un
-1
.la source
J'ai trouvé la meilleure démo et explication pour ContentProvider et je pense qu'il a suivi les normes Android.
Classes de contrat
et classes intérieures:
Création de la base de données en utilisant SQLiteOpenHelper :
Fournisseur de contenu:
J'espère que cela vous aidera.
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/
Remarque: j'ai copié du code simplement parce que si le lien de la démo ou de l'article peut être supprimé à l'avenir.
la source