首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Android中的任何时候AppDatabase都可以是空的吗?

在Android中的任何时候AppDatabase都可以是空的吗?
EN

Stack Overflow用户
提问于 2018-11-05 06:26:22
回答 1查看 612关注 0票数 1

在添加空间数据库时,建议采用单例设计模式

注意:在实例化AppDatabase对象时,您应该遵循单例设计模式,因为每个RoomDatabase实例都相当昂贵,而且很少需要访问多个实例。

因此,按照用Java编写的Google示例,在下面添加空间数据库如下

代码语言:javascript
运行
复制
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?,并满足文档推荐的要求?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-19 17:40:12

使用这样的方法来确保它不是空的。

代码语言:javascript
运行
复制
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
    }
}

用:

代码语言:javascript
运行
复制
val db = DatabaseSource.getInstance(context)

这将永远不会是null,所以您不再有这个问题。

我在getInstance()调用中添加了双锁以确保线程安全。

但实际上,您应该使用带有单例的依赖项注入,以避免这种依赖关系在上下文和手动创建/锁定中传递。您必须在任何地方都可以使用上下文,这是一种糟糕的模式。

这也是对your other post的回答,这显然是对这个答案的重复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53149350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档