J'essaie de migrer un projet vers Android Room. Après avoir lu la documentation d'Android Room, j'ai remarqué qu'un Singleton était approprié pour accéder à ma base de données.
Citation du développeur Android :
Note : Si votre application fonctionne dans un seul processus, vous devriez suivre le modèle de conception singleton lors de l'instanciation d'un objet AppDatabase. Chaque instance de RoomDatabase est assez coûteuse, et vous avez rarement besoin d'accéder à plusieurs instances au sein d'un même processus.
J'ai écrit le code suivant :
@Database(entities = {Category.class, News.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static final String DB_NAME = "database.db";
private static AppDatabase instance;
public abstract CategoryDao categoryDao();
public abstract NewsDao newsDao();
private AppDatabase () {}
public static AppDatabase getInstance(Context context) {
if (instance == null) {
synchronized (AppDatabase.class) {
if (instance == null) {
instance = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, DB_NAME).build();
}
}
}
return instance;
}
}
Il s'agit simplement d'une double vérification du verrouillage de Singleton.
J'ai lu quelques guides/tutoriels et presque tout le monde a une approche similaire, mais je vois quelques problèmes avec cette approche :
- Nécessité de passer un
Context
à chaque fois, même si vous n'en avez besoin qu'une seule fois pour initialiser le Singleton. - Que se passe-t-il si j'ai besoin d'accéder à la base de données sans un
Context
disponible ? - Est-il même admissible d'envoyer des paramètres à un Singleton ?
Une idée pour mettre en place un Singleton de base de données des salles qui résoudrait ces problèmes ?
J'aimerais éviter les bibliothèques DI comme Dagger2 si possible.