С новой базой данных комнат в Android у меня есть требование, в котором необходимо выполнить две последовательные операции:
removeRows(ids);
insertRows(ids);
Если я запустил это, я вижу (при изучении базы данных), что отсутствуют некоторые строки - я предполагаю, что они удаляются после вставки. а именно первая операция выполняется параллельно со второй.
Если я использую такой блок транзакции, как этот, то все в порядке - кажется, что первая операция завершается раньше, чем вторая:
roomDb.beginTransaction();
removeRows(ids);
roomDb.endTransaction();
insertRows(ids);
Также нормально, если вместо этого я дам поспать между ними:
removeRows(ids);
Thread.sleep(500);
insertRows(ids);
Похоже, что документации для Room не так много, и мне было интересно, следует ли мне использовать блок транзакций, подобный приведенному выше, когда мне нужно выполнить последовательные операции, или есть какой-либо лучший способ сделать это.
РЕДАКТИРОВАТЬ: после указания @CommonsWare @Query
являются асинхронными, а @Insert
и @Delete
- синхронными. В связи с этим, как мне получить запрос, который удаляет строки как асинхронные:
@Query("DELETE from table WHERE id IN(:ids)")
int removeRows(List<Long> ids);
В соответствии с выводом сборки я получаю Deletion methods must either return void or return int (the number of deleted rows)
, если пытаюсь обернуть возвращаемый тип в Flowable
.
removeRows()
иinsertRows()
? Если это простые методы@Delete
и@Insert
DAO, тогда они должны быть сериализованы естественным образом, поскольку эти методы выполняются синхронно. Единственное место, где Room выполняет асинхронные операции, - это@Query
с реактивным возвращаемым значением (LiveData
,Flowable
и т. Д.). - person CommonsWare   schedule 23.06.2017insertRows()
просто@Insert
, уremoveRows()
есть@Query
вызовов. Думаю, это объясняет. Итак, я полагаю, что ответ на мой вопрос - подписаться на реактивный ответ на запросы. - person rajath   schedule 24.06.2017@Query
, который выполняетDELETE
, чтобы я мог наблюдать за ним до завершения? - person rajath   schedule 24.06.2017@Query
, который возвращаетint
, должен быть синхронным. Как я уже писал, единственное место, где Room выполняет асинхронные операции, - это@Query
с реактивным возвращаемым значением (LiveData
,Flowable
и т. Д.). Возможно, это ошибка где-то в комнате. Есть ли особая причина, по которой вы используете@Query
, а не@Delete
?@Delete
уже предлагаетIN
поддержку списка идентификаторов. - person CommonsWare   schedule 24.06.2017removeRows
- это только одна из двух операций удаления, которые я выполняю. У другого есть более сложный запрос, который, если вы думаете, что это поможет, я могу добавить к вопросу. Можете ли вы также сказать или указать мне, где@Delete
предлагаетIN
поддержку списка идентификаторов? - person rajath   schedule 24.06.2017@Insert
,@Update
и@Delete
принимают один идентификатор, набор идентификаторов или несколько аргументов идентификаторов. developer.android.com/topic/libraries/architecture/ а> - person CommonsWare   schedule 24.06.2017@Query
все сущности и не передам их@Delete
, но это сильно скажется на производительности. Может быть, этот запрос функции - хорошая идея :-) - person rajath   schedule 24.06.2017@Query
возвратint
должен быть синхронным, поскольку это не реактивное возвращаемое значение. Попробуйте поставить точку останова там, где вы вызываетеremoveRows()
, затем выполните сгенерированный код и посмотрите, выполняется ли запрос синхронно или асинхронно. Вы можете сделать то же самое со своимinsertRows()
. Если один или другой является асинхронным (чего быть не должно), это поможет объяснить ваши симптомы. - person CommonsWare   schedule 24.06.2017@Query
, на основе которого мне пришлось выполнить некоторые вычисления и удалить некоторые строки. Этот предыдущий вызов был асинхронным и вызывал проблемы.@Delete
и@Insert
называют себя синхронными. Большое спасибо за вашу помощь. - person rajath   schedule 25.06.2017@Delete
(а также@Update
) ищет строки на основе первичного ключа. Итак, если вы установите свой идентификатор как@PrimaryKey
, вы создадите фиктивный объект с желаемым идентификатором в качестве ключа, а затем передадите его функции удаления. - person Sourav Kannantha B   schedule 07.05.2021