Запросы комнат происходят асинхронно? - PullRequest
0 голосов
/ 20 апреля 2020

Является ли База данных комнаты запросов asyn c? И если да, то из-за отсутствия лучшего термина что-то подобное этому условию асинхронности / расы безопасно?

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

Другими словами, возможно ли в этом случае для dao попытаться вставьте thing до завершения dao.deleteAllThings(), и, следовательно, есть шанс удалить только что вставленный thing?

Если да, то каким образом вы все обрабатываете подобные вещи, чтобы убедиться, что вы делаете не пытаетесь вставить, пока удаление не будет завершено?

Мне также интересно узнать об одном и том же сценарии использования с roomDatabase.clearAllTables из-за разговоров в этой теме .

1 Ответ

0 голосов
/ 20 апреля 2020

Они не являются асинхронными c Если они являются простыми @Delete и @Insert методами DAO, то их следует сериализовать естественным образом, поскольку эти методы выполняются синхронно.

Единственное место, где Room выполняет асинхронную работу, находится на @Query с реактивным возвращаемым значением (LiveData, Flowable и т. Д. c.).

Могут возникнуть проблемы при одновременных модификациях, когда запуск нескольких транзакций / операций в разных потоках или из разных планировщиков / диспетчеров.

В вашем случае у вас есть одна сопрограмма, в которой они будут выполняться последовательно. Поэтому можно думать, что сначала вы удалите, а затем вставите.

Вы также можете создать Transaction для выполнения нескольких запросов.

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

...