12
votes

Android: accéder à une base de données unique de plusieurs activités en application?

J'ai une application de type de liste TODO qui stocke toutes les données de notes dans une base de données SQLITE3. Chaque activité de l'application doit accéder à la base de données pour éditer différentes parties des données en temps réel.

Actuellement, j'ai chaque activité ouvre son propre objet dbmanager (la classe d'assistance que j'ai créée pour gérer la base de données). Cela cause des problèmes cependant et j'aimerais une solution d'accès légèrement plus globale, donc je n'ai pas à continuer d'ouvrir / fermer / créer une base de données.

J'enseigne plusieurs options et j'aimerais entendre des avantages et des inconvénients de chacun ainsi que d'autres suggestions.

  1. style singleton. Avoir une classe wrapper qui renvoie une référence au seul gestionnaire de base de données, donc toute activité dont elle a besoin peut l'utiliser.

  2. Gestionnaire statique. Demandez aux membres de la classe Manager entièrement statiques et d'ouvrir la base de données sur la charge. Facilement accessible par quiconque en a besoin (qui est tout le monde).

  3. fusion entre 1 et 2. Je pourrais faire une classe de gestionnaire de base de données qui initialise l'instance Singleton membre de la base de données et toutes les méthodes de manipulation de données étaient statiques. Ensuite, je n'aurais même pas besoin d'une référence au singleton pour accéder à la base de données. J'aime bien cette solution, veuillez souligner les descentes.

    suggestions?


0 commentaires

4 Réponses :


0
votes

La manière recommandée de faire cela sur Android est d'utiliser un ContentProvider . Votre premier fournisseur de contenu peut avoir envie de plus de problèmes que ce qu'il vaut la peine, mais une fois que vous avez reçu le motif, cela ne devrait pas être trop mal à condition que vous n'ayez pas essayé de sérialiser les blobs.


4 commentaires

Détails sur les fournisseurs de contenu ici: développeur.android.com/guide/topics/ Les fournisseurs / ... Voir également l'échantillon Notepad groupé avec le SDK pour une idée de la façon de les utiliser.


Les fournisseurs de contenu sont pour le partage des données croisées. Les utiliser comme une couche à l'intérieur d'une seule application diminue les performances et diminue la flexibilité (par exemple, aucune jonction).


J'ai juste besoin d'accéder aux données à l'intérieur de ma propre application et d'une base de données, mes besoins sont les meilleurs. Je veux juste pouvoir y accéder plus facilement que l'ouverture d'une nouvelle classe d'assistance dans chaque vue d'activité et de contrôle qui doit persister les données.


@emmby puis-je utiliser un fournisseur de contenu avec chargeur Manager à partir de l'objet de l'application ou est-ce un nouvel inconvénient de fournisseurs de contenu?



4
votes

Cela cause des problèmes si

Qui sont ... Quoi?

Et je voudrais un peu plus Solution d'accès global donc je n'ai pas Conserver l'ouverture / la fermeture / la création d'un base de données.

Ouverture et fermeture d'une base de données SQLite est bon marché. Les statiques et les singletons doivent être évités dans la mesure du possible. Qu'est-ce qui vous fait penser que votre solution actuelle est mauvaise?


7 commentaires

Je devais peut-être accéder à la base de données de chaque vue dans une liste personnalisée à un moment donné et je voulais savoir s'il y avait une option pour cela. Créer un nouvel objet Manager pour chaque vue serait coûteux. C'est ce qui cause des problèmes.


"La création d'un nouvel objet Manager pour chaque vue serait chère." Ensuite, ne créez pas de nouveaux gestionnaires pour chaque vue. Ce n'est pas comme ça que Android fonctionne. 1. Exécutez une requête (), obtenez un curseur. 2. Enveloppez le curseur dans une sous-classe personnalisée de SimpleCursoradapter. 3. Remplacez BindView () dans le SimpleCursorAdapter pour obtenir des données hors de la position du curseur et versez-la dans la ligne. 4. Supprimez NewView () pour créer une instance de la vue ligne en question. 5. Maintenez votre adaptateur personnalisé à votre liste de liste.


J'ai décidé de créer ma propre liste de lecture personnalisée car je devais gérer des événements de clic à partir des contrôles des boutons sur les vues de contenu et la liste de liste standard provoque des problèmes avec ceux de la conception. Je fais le curseur me liant et génère la liste. La raison pour laquelle je voudrais accéder à la base de données à partir des points de vue est parce que je dois mettre à jour un champ basé sur des événements clic internes à la vue. Si j'avais un accès mondial à la base de données, je n'aurais pas besoin de refléter ces événements dans la liste personnalisée et que cela faciliterait également les autres parties de l'application.


"La raison pour laquelle j'accéderais à la base de données des points de vue est parce que je dois mettre à jour un champ basé sur des événements clic internes à la vue." Si votre vue est une classe interne de votre activité, vous avez déjà accès à la base de données. Si votre vue n'est pas une classe intérieure de votre activité, cela peut être ajusté en 10-15 secondes, j'imagine.


Je n'ai jamais pensé à faire la classe de vision interne. Je l'aime bien. +1 pour ça.


Juste une mise à jour de votre avantage. La suggestion de rendre la classe d'opinion Une classe intérieure de l'activité m'a permis de résoudre plusieurs problèmes avec ma demande. Cela, combiné à un autre poste sur la fabrication des enfants non concentrés, m'a permis de mettre en œuvre mon activité comme une activité de liste standard. Votre message n'a pas répondu à ma question spécifique, alors GREGM obtient toujours la coche, mais vous avez résolu ma question sous-jacente, merci.


Ouais, les classes intérieures fonctionnent assez bien dans divers endroits d'Android. Une technique hautement recommandée. Content que cela fonctionne pour vous!



10
votes

À mon avis, le fournisseur de contenu est compliqué et si vous ne partageez pas avec des activités qui ne sont pas les vôtres, vous n'en avez pas besoin. Par conséquent, je vous suggère d'utiliser une classe singleton d'abord. Ensuite, si vous avez plus de temps ou en avez besoin, optez pour le fournisseur de contenu.

J'ai utilisé un singleton avec succès pendant 6 mois sans trop de difficulté. (Je faisais attention à vraiment faire un singleton, une seule instance qui charge les données une fois)

singleton

  • Avantage: Facile à mettre en œuvre
  • avantage: parce que j'ai utilisé un commun instance, je pourrais implémenter la mise en cache facilement et donc faire la demande ne pas avoir à faire dans la base de données comme Souvent
  • Inconvénient: Impossible de partager vos données avec des activités externes

    Fournisseur de contenu

    • avantage: vous pouvez partager vos données avec des activités externes
    • avantage: vous pouvez vous intégrer avec le Rechercher API
    • Inconvénient: compliqué, besoin de représenter vos données dans une autre manière
    • Inconvénient: encore une autre API Android passer du temps à apprendre

2 commentaires

Jamais considéré le contenu des fournisseurs de contenu parce que j'ai aimé la base de données, familiarisez-vous avec SQL et n'avez pas besoin de partager des données avec des applications extérieures. Qu'en est-il du singleton par rapport à statique? Pourrais-je faire une classe de gestion de base de données qui a créé son propre singleton et toutes les méthodes d'accès étaient statiques? Ensuite, je n'aurais même pas besoin d'une référence au singleton?


En 4 ans d'exécution de mon application, je n'ai jamais eu à supprimer le singleton. Dans le cas rare que le système Android le décharge, cette application suffit à la réinitialiser.



0
votes

Il est 2018 et entre-temps Android a évolué.

Composant d'architecture Android recommandé pour ce cas d'utilisation aujourd'hui est une salle Android.


0 commentaires