在DBFlow的文档中,您可以阅读:
虽然通常可以避免同步保存数据,但要小一些 它的数据量很小。
太棒了! ......但是,另一方面有这个通知:
如果您进行读写操作,对主线程执行操作可能会阻止它 在主要访问DB时访问不同线程上的DB。
因此,如果我理解正确,如果我有例如android服务,使用异步事务(在单独的线程中)定期读取/写入db,并且用户单击Activity中执行简单model.save()
的按钮,那么主要我的Android应用程序的线程将被阻止,应用程序将“冻结”,直到db解锁。
是吗?
如果是,解决办法可能是将所有数据库调用放在异步线程的队列中,如:
interface AsyncResult {
fun onResult(success: Boolean)
}
fun MyModel.save(callback: AsyncResult) {
database<AppDatabase>().beginTransactionAsync { this.save() }
.success { callback.onResult(true) }
.error { _, _ -> callback.onResult(false)}
.build()
.execute()
}
并从Activity中执行它:
myModel.save(object: AsyncResult {
override fun onResult(success: Boolean) = if (success) showToast("got it")
})
但是不是简单的调用,如save(),insert()包含在隐式事务中,所以我们最终得到嵌套事务? 更不用说模型和视图层上的所有样板代码。
处理这类问题的正确方法是什么?