Предположим, я сохранил свой экземпляр базы данных в Kotlin object
object Foo {
var testDb: RoomDatabase?
fun setDb(db: RoomDatabase) {
testDb = db
}
fun getDb() : RoomDatabase {
return testDb
}
}
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
val db = Room.databaseBuilder(applicationContext,
TestDatabase::class.java, "user1").build()
Foo.setDb(db)
}
}
Позже, в моем приложении, я должен позвонить Foo.getDb()?.close()
, чтобы установить другое соединение с базой данных, поскольку моему приложению необходимо воссоздать , например, переключение учетных записей и т. д. c.
// in thread A
executorService.execute {
Foo.getDb()?.close()
val db = Room.databaseBuilder(getApplicationContext(),
TestDatabase::class.java, "user2").build()
Foo.setDb(db)
}
// in thread B
executorService.execute {
Foo.getDb()?.getSomeDao().doSomeTransactions()
}
Кажется, здесь возникнут некоторые проблемы.
- поток B может запускать транзакции после немедленного вызова
Foo.getDb()?.close()
, что вызовет исключение, показывающее, что соединение с базой данных было закрыто. - поток B может запускать транзакции после того, как
db
воссоздается как соединение user2
, тогда транзакции будут записываться в базу данных user2
, который не принимается.
Я попытался решить эту проблему с помощью одноэлементного экземпляра базы данных, но это не решило проблему. Есть ли способ уведомить комнату об отмене всех транзакций, которые были отправлены после того, как я позвоню close
?