在 DBFlow 的文档中,您可以阅读:
虽然通常应避免同步保存数据,但对于少量数据它几乎没有效果。
那太棒了!...但是,另一方面有这个通知:
如果您在访问主线程上的数据库时在不同的线程上读取和写入数据库,则在主线程上执行操作可能会阻塞它。
因此,如果我正确理解这一点,如果我有例如使用异步事务(在单独的线程中)定期读取/写入数据库的 android 服务,并且用户单击 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() 这样的简单调用不都包含在隐式事务中,所以我们最终得到了嵌套事务吗?更不用说模型和视图层上的所有样板代码。
处理此类问题的正确方法是什么?