【发布时间】:2019-05-08 07:21:18
【问题描述】:
我正在尝试将项目迁移到 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 发送参数?
任何想法如何实现一个房间数据库单例来解决这些问题?
如果可能的话,我想避免像 Dagger2 这样的 DI 库。
【问题讨论】:
-
“来自 Android 开发者的报价:”来自哪里?请具体说明,添加姓名、姓氏、排名和引用来源的链接。
-
我认为您的“双重检查锁定 Singleton”是错误的,请参阅“使用此模式要记住的一件事是该字段需要是可变的以防止缓存不连贯问题。” -> baeldung.com/java-singleton-double-checked-locking
标签: android singleton android-room android-jetpack