假设我将数据库实例存储在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()
建立另一个数据库连接,因为我的应用程序需要重新创建,例如切换帐户等。
// 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()
}
似乎这里会有一些问题。
Foo.getDb()?.close()
立即调用之后运行事务,这将触发异常,表明数据库连接已关闭。db
作为user2
的连接之后运行事务,然后这些事务将被写入user2
的数据库中,这并不例外。我试图通过单例解决数据库实例,但是并不能解决问题。有没有一种方法可以通知我的房间,以放弃在致电close
之后提交的所有交易?