Как уведомить базу данных комнат об отмене транзакций после закрытия базы данных? - PullRequest
0 голосов
/ 20 июня 2020

Предположим, я сохранил свой экземпляр базы данных в 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()
}

Кажется, здесь возникнут некоторые проблемы.

  1. поток B может запускать транзакции после немедленного вызова Foo.getDb()?.close(), что вызовет исключение, показывающее, что соединение с базой данных было закрыто.
  2. поток B может запускать транзакции после того, как db воссоздается как соединение user2, тогда транзакции будут записываться в базу данных user2 , который не принимается.

Я попытался решить эту проблему с помощью одноэлементного экземпляра базы данных, но это не решило проблему. Есть ли способ уведомить комнату об отмене всех транзакций, которые были отправлены после того, как я позвоню close?

...