在添加房间数据库时,建议使用单例设计模式
因此,按照Google用Java编写的示例添加Room Database,如下所示
private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase? {
if (INSTANCE == null){
synchronized(AppDatabase::class){
INSTANCE = Room.databaseBuilder(context.applicationContext,
AppDatabase::class.java, "app_database")
.build()
}
}
return INSTANCE
}
当我调用
getInstance
时,编译器建议getInstance
可以是null
。所以我的问题是,在任何情况下getInstance
是null
,我是否必须检查它是否为null
。如果不是,那么我应该如何实例化AppDatabase
,以便getInstance
返回AppDatabase
而不是AppDatabase?
,并且适合文档建议? 最佳答案
使用类似这样的方法来确保它不为空
object DatabaseSource {
private lateinit var INSTANCE: AppDatabase
fun getInstance(context: Context): AppDatabase {
if (!::INSTANCE.isInitialized) {
synchronized(AppDatabase::class) {
if (!::INSTANCE.isInitialized) {
INSTANCE = Room.databaseBuilder(context.applicationContext,
AppDatabase::class.java,
"app_database").build()
}
}
}
return INSTANCE
}
}
调用它:
val db = DatabaseSource.getInstance(context)
而且它永远不会是
null
,因此您不再遇到该问题。我在
getInstance()
调用中添加了双重锁定,以更安全地保护线程。但是实际上,您应该对单例使用依赖项注入(inject),以避免在上下文依赖项和手动创建/锁定中传递此依赖项。您必须在任何地方都可以使用上下文,这是一个错误的模式。
这也可以作为your other post的答案,它显然是此副本的副本。
关于kotlin - Android Room中的AppDatabase可以随时为空吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53149350/