DBFlow - 异步数据库调用

时间:2017-07-21 07:30:17

标签: multithreading sqlite transactions dbflow

在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()包含在隐式事务中,所以我们最终得到嵌套事务? 更不用说模型和视图层上的所有样板代码。

处理这类问题的正确方法是什么?

0 个答案:

没有答案