关闭数据库后如何通知会议室数据库放弃交易?

时间:2020-06-20 03:39:02

标签: kotlin android-room

假设我将数据库实例存储在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()
}

似乎这里会有一些问题。

  1. 线程B可能在Foo.getDb()?.close()立即调用之后运行事务,这将触发异常,表明数据库连接已关闭。
  2. 线程B可能在重新创建db作为user2的连接之后运行事务,然后这些事务将被写入user2的数据库中,这并不例外。

我试图通过单例解决数据库实例,但是并不能解决问题。有没有一种方法可以通知我的房间,以放弃在致电close之后提交的所有交易?

0 个答案:

没有答案