android中开启事务的方法正确的是,Android Room数据库事务

使用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 ids);

根据构建输出我得到Deletion methods must either return void or return int (the number of deleted rows) ,如果我尝试将返回types包装在Flowable 。

正如@CommonsWare指出的那样,@ Query是异步的,而@ Insert,@ Delete,@ Update是同步的。

如果您想在单个事务中执行多个查询,Room还提供了一种方法,如下所述。

roomDB.runInTransaction(new Runnable() { @Override public void run() { removeRows(ids); insertRows(ids); } });

我希望这能解决你的问题。

正如在Transaction的文档中指出的那样,您可以执行以下操作:

@Dao public abstract class ProductDao { @Insert public abstract void insert(Product product); @Delete public abstract void delete(Product product); @Transaction public void insertAndDeleteInTransaction(Product newProduct, Product oldProduct) { // Anything inside this method runs in a single transaction. insert(newProduct); delete(oldProduct); } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值