Я пытаюсь использовать 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
. - singleton должен быть потокобезопасным, поскольку несколько потоков могут обращаться к нему одновременно.
- должен иметь возможность принимать
Context
в качестве аргумента.
Я просмотрел все похожие вопросы StackOverflow, и ни один из них не удовлетворяет моим требованиям.
Singleton с аргументом в Kotlin не является потокобезопасным
Kotlin - лучший способ конвертировать Singleton DatabaseController в Android не является потокобезопасным
Поток Kotlin сохраняет собственный ленивый синглтон с параметром использует объект
Room.databaseBuilder()
является «дорогим»? Этот вызов предназначен для выполнения в потоке пользовательского интерфейса, поэтому я ожидаю, что он должен быть очень легким. - person Alex Peters   schedule 16.11.2017