Room 查询是否异步发生?

TJ *_*sen 2 android asynchronous kotlin android-room

房间数据库查询是异步的吗?如果是这样,由于缺乏更好的术语,像这样的异步/竞争条件安全吗?

fun insertThingAsync(thing: Thing) = async(Dispatchers.IO) {
  try {
    dao.deleteAllThings()
    dao.insertThing(thing)
  }
  catch (e: Throwable) {
    // Stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,在这种情况下,是否有可能在完成之前dao尝试插入,因此也有机会删除新插入的内容?thingdao.deleteAllThings()thing

如果是这样,你们都用什么方法来处理这样的事情,以确保在删除完成之前不会尝试插入?

roomDatabase.clearAllTables由于此线程中的对话,我还想知道与 的相同用例。

Rai*_*ker 5

它们不是异步的。如果它们是普通方法@Delete@InsertDAO 方法,那么它们应该自然地序列化,因为这些方法是同步执行的。

Room 执行异步操作的唯一地方是使用@Query响应式返回值(LiveData、Flowable 等)。

在不同线程或不同调度程序/调度程序中启动多个事务/操作时,可能会出现并发修改问题。

在您的情况下,您有一个协程,它们将在其中按顺序运行。因此,可以放心地认为您将先删除然后再插入。

您还可以创建Transaction执行多个查询。

https://developer.android.com/reference/androidx/room/Transaction