gpt4 book ai didi

kotlin - Android Room 中的 AppDatabase 可以随时为空吗?

转载 作者:行者123 更新时间:2023-12-02 13:37:30 29 4
gpt4 key购买 nike

添加房间数据库时,建议使用单例设计模式

Note: You should follow the singleton design pattern when instantiating an AppDatabase object, as each RoomDatabase instance is fairly expensive, and you rarely need access to multiple instances.



因此,按照用 Java 编写的 Google 示例添加房间数据库,如下所示
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 .所以我的问题是 getInstancenull我必须检查它是否是 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com