Utilisation de SQLite par activité et service

J'ai créé une classe de base de données qui utilise une instance unique d'objet db. L'objet est créé dans l'activité principale et se ferme sur la méthode Destroy. Cela semble correct (mais obtenez des erreurs telles que: db déjà fermé ou db n'est pas ouvert sur certains appareils utilisateurs que je ne peux pas simuler).

Je souhaite ajouter un service à l'application pour le téléchargement de contenu et ce service peut fonctionner avec un planificateur qui me fait penser à une instance unique d'objet db ne fonctionnera pas. Devrais-je utiliser un autre objet pour le service, cela entraînera-t-il des problèmes de cohérence? Pouvez-vous conseiller de quelle manière serait la meilleure façon?

Databaseprovider classe exm:

public class DatabaseProvider { private static DatabaseHelper helperWriter; public static SQLiteDatabase db_global; public DatabaseProvider(Context c) { helperWriter = DatabaseHelper.getHelper(c, true); } private static SQLiteDatabase getDB() { if(db_global == null) db_global = helperWriter.getWritableDatabase(); else if(!db_global.isOpen()) { try { db_global.close(); } catch(Exception ex) { ex.printStackTrace(); } db_global = helperWriter.getWritableDatabase(); } return db_global; } public String GetVersion() { SQLiteDatabase db = getDB(); Cursor c = db.query(DatabaseHelper.PARAMETER_TABLE_NAME, new String[] {"VALUE"}, "KEY='Version'", null, null,null,null); String version = ""; if(c.moveToNext()) { version = c.getString(0); } else version = "0"; c.close(); return version; } public long UpdateVersion(String value) { ContentValues initialValues = new ContentValues(); initialValues.put(DatabaseHelper.PARAMETER_COLUMN_VALUE, value); SQLiteDatabase db = getDB(); long r = db.update(DatabaseHelper.PARAMETER_TABLE_NAME, initialValues, "KEY='Version'", null); if(r <= 0) r = helperWriter.AddParameter(db, "Version", value); //db.close(); return r; } public void CloseDB() { if (db_global != null) db_global.close(); db_global = null; helperWriter.close(); } } 

  • Android ExpandableListView et base de données SQLite
  • Quelle est la différence entre SQLite et SQL
  • Est-ce que le curseur SQLite de SQL charge tous les enregistrements dans la mémoire à la fois?
  • Taille maximale de la base de données SQLite en mémoire d'une application Android?
  • Un objet SQLiteConnection pour la base de données a été divulgué! Veuillez corriger votre demande
  • Android: impossible d'effectuer cette opération car le pool de connexion a été fermé
  • WhereArgs suppression de la base de données SQLite
  • Comment mettre à jour une valeur de colonne de la base de données sqlite d'android pour annuler l'utilisation de ContentValues?
  • 2 Solutions collect form web for “Utilisation de SQLite par activité et service”

    Je ne sais pas si cela aidera, mais …

    Vous ne pouvez pas compter sur onDestroy () au cas où l'application se bloque. Android peut également garder votre application dans la RAM, même si vous la quittez. En outre, votre activité principale peut être détruite lorsque l'application est utilisée si vous êtes sous-activé. Il peut également être recréé.

    Parfois, il est préférable d'avoir des appels qui ouvrent la base de données, de faire des choses et de le fermer dans la même fonction. Si vous utilisez un service, cela peut aider les choses. Je ne suis pas sûr si vous devriez avoir une situation où une base de données peut être ouverte et / ou accessible d'une variété à différents endroits à la fois sans code de gestion

    Je vois quelques questions:

    UNE)

    (Mais obtenez des erreurs telles que: db déjà fermé ou db n'est pas ouvert sur certains appareils utilisateurs que je ne peux pas simuler). … Démarrez une activité, puis mettez à jour le contenu et certaines opérations db dans AsyncTask. Alors que la mise à jour est en cours, revenez en arrière et recommencez la même activité.

    Pour contourner ces erreurs, avez-vous envisagé d'utiliser [Loader][1] ? C'est un cadre basé sur le rappel sur ContentProvider s.


    B)

    Ajoutez un service à l'application pour le téléchargement du contenu et ce service peut fonctionner avec un planificateur qui me fait penser à une instance unique de l'objet db ne fonctionnera pas. Devrais-je utiliser un autre objet pour le service, cela entraînera-t-il des problèmes de cohérence?

    Cette publication de @commonsware à partir de ce site Web suggère de ne pas utiliser le Service pour les tâches courantes. Au lieu de cela, le AlarmManager est suggéré. Je n'ai travaillé que pour des services de courte durée (pour les IO audio).

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.