【发布时间】:2018-02-05 08:19:25
【问题描述】:
我正在尝试将 Room 用作单例,因此我不必多次调用 Room.databaseBuilder() - 这很昂贵 - 。
@Database(entities = arrayOf(
Price::class,
StationOrder::class,
TicketPrice::class,
Train::class,
TrainCategory::class
), version = 2)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun dao(): TrainDao
companion object {
fun createDatabase(context: Context): AppDatabase
= Room.databaseBuilder(context, AppDatabase::class.java, "trains.db").build()
}
}
注意:
- 无法使用 Object,因为 Room 需要使用
abstract class。 - 单例必须是线程安全的,因为多个线程可能同时访问它。
- 必须能够将
Context作为参数。
我查看了所有类似的 StackOverflow 问题,但没有一个满足我的要求
Singleton with argument in Kotlin 不是线程安全的
Kotlin - Best way to convert Singleton DatabaseController in Android 不是线程安全的
Kotlin thread save native lazy singleton with parameter 使用对象
【问题讨论】:
-
您能否解释一下为什么您说调用
Room.databaseBuilder()是“昂贵的”?此调用设计为在 UI 线程上进行,因此我的期望是它应该非常轻量级。 -
注意:如果您的应用程序在单个进程中运行,则在实例化 AppDatabase 对象时应遵循单例设计模式。每个 RoomDatabase 实例都相当昂贵,您很少需要在单个进程中访问多个实例。 |来源:developer.android.com/training/data-storage/room/index.html
标签: android singleton kotlin android-room