首页 文章

Android Room数据库事务

提问于
浏览
14

使用Android中的新房间数据库,我需要有两个顺序操作需要进行:

removeRows(ids);
insertRows(ids);

如果我运行它,我看到(在检查数据库时)有一些行丢失 - 我假设它们在插入后被删除 . 即第一个操作与第二个操作并行运行 .

如果我使用一个事务块,比如这个,那么一切都很好 - 第一个操作似乎在完成第二个之前完成:

roomDb.beginTransaction();
removeRows(ids);
roomDb.endTransaction();

insertRows(ids);

如果我在中间睡觉,那也没关系:

removeRows(ids);
Thread.sleep(500);

insertRows(ids);

Room似乎没有太多的文档,并且想知道我是否应该在完成顺序操作时使用上面的事务块,或者是否有更好的方法 .

EDIT :在@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 中 .

2 回答

  • 13

    正如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);
         }
     }
    
  • 14

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

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

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

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

相关问题