Я пытаюсь перенести проект в Android Room.Прочитав документацию по Android Room, я заметил, что Singleton подходит для доступа к моей базе данных.
Цитата от разработчика Android:
Примечание. Если ваше приложение работает в одном процессе, выдолжен следовать шаблону одноэлементного проектирования при создании экземпляра объекта AppDatabase.Каждый экземпляр RoomDatabase довольно дорогой, и вам редко требуется доступ к нескольким экземплярам в рамках одного процесса.
Я написал следующий фрагмент кода:
@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;
}
}
Просто двойнойпроверка блокировки синглтона.
Я прочитал несколько руководств / учебных пособий, и почти у всех есть подобный подход, однако я вижу некоторые проблемы с этим подходом:
- Необходимо передать
Context
каждыйвремя, даже если вам нужен только один раз для инициализации Singleton. - Что если мне нужно получить доступ к базе данных без
Context
в наличии? - Даже допустимо отправлять параметры в Singleton?
Есть идеи, как реализовать Singleton Room Database, который решает эти проблемы?
Я хотел бы по возможности избегать библиотек DI, таких как Dagger2.