С новой базой данных на базе Android в Android у меня есть требование, где необходимо выполнить две последовательные операции:
removeRows(ids);
insertRows(ids);
Если я запустил это, я вижу (при рассмотрении db), что некоторые строки отсутствуют - я предполагаю, что они удаляются после вставки. а именно первая операция выполняется параллельно со вторым.
Если я использую транзакционный блок, например, этот, то все отлично - первая операция, кажется, завершается, прежде чем делать вторую:
roomDb.beginTransaction();
removeRows(ids);
roomDb.endTransaction();
insertRows(ids);
Это также прекрасно, если я вместо этого даю сон:
removeRows(ids);
Thread.sleep(500);
insertRows(ids);
Кажется, что нет много документации для комнаты, и мне было интересно, должен ли я использовать транзакционный блок, как указано выше, когда у меня есть последовательные операции, или есть лучший способ сделать это.
EDIT. После того, как @CommonsWare указал, @Query
являются асинхронными, а @Insert
и @Delete
являются синхронными. В связи с этим, как бы получить запрос, который удаляет строки async:
@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
.