如何在Kotlin中简化用于Android房间数据库初始化的单例?
@Database(entities = arrayOf(Book::class, User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun bookModel() : BookDao
abstract fun userModel() : UserDao
companion object {
private var INSTANCE: AppDatabase? = null
fun getInMemoryDatabase(context: Context): AppDatabase {
if (INSTANCE == null) {
INSTANCE = Room.inMemoryDatabaseBuilder(context.applicationContext, AppDatabase::class.java).build()
}
return INSTANCE!!
}
fun destroyInstance() {
INSTANCE = null
}
}
}
最佳答案
您可以使用数组文字([]
)代替arrayOf
,并且可以使用elvis运算符进行空检查。参见here。
@Database(entities = [Book::class, User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun bookModel() : BookDao
abstract fun userModel() : UserDao
companion object {
private var INSTANCE: AppDatabase? = null
fun getInMemoryDatabase(context: Context): AppDatabase {
INSTANCE = INSTANCE ?: Room.inMemoryDatabaseBuilder(context.applicationContext, AppDatabase::class.java).build()
return INSTANCE!!
}
fun destroyInstance() {
INSTANCE = null
}
}
}
由于您需要实例,因此必须将其保存在某个地方,因此使用companion object
对我来说似乎是一个合理的解决方案。如果您不希望将实例保存在
AppDatabase
中,也可以使用一个对象(在Kotlin中是单例)。object AppDatabaseProvider {
private var INSTANCE: AppDatabase? = null
fun getInMemoryDatabase(context: Context): AppDatabase {
// ...
}
fun destroyInstance() {
INSTANCE = null
}
}
这两个都是在Kotlin中处理静态数据的选项,但是您不会比这更短。