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

时间:2018-11-05 06:26:23

标签: kotlin singleton

在添加会议室数据库时,建议使用单例设计模式

  

注意:实例化AppDatabase对象时应遵循单例设计模式,因为每个RoomDatabase实例都非常昂贵,并且您几乎不需要访问多个实例。

因此,按照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。所以我的问题是,在任何情况下,getInstancenull,我是否必须检查它是否是null。如果没有,那么我应该如何实例化AppDatabase以便getInstance返回AppDatabase而不是AppDatabase?并符合文档建议?

1 个答案:

答案 0 :(得分:0)

使用类似的方法来确保它不为空

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()调用中更加安全地保护线程。

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

这也可以作为对your other post的回答,这显然是对此的重复。