Room- @Transaction


Marks a method in a Dao class as a transaction method.

When used on a non-abstract method of an abstract Dao class, the derived implementation of the method will execute the super method in a database transaction. All the parameters and return types are preserved. The transaction will be marked as successful unless an exception is thrown in the method body.



>> 将Dao类中的方法标记为事务方法。

当用于抽象Dao类的非抽象方法时,该方法的派生实现将在数据库事务中执行super方法。 所有参数和返回类型均被保留。 除非在方法主体中引发异常,否则事务将被标记为成功。

@Transaction


Example:

@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);
     }
 }

 

当在具有Select语句的Query方法上使用时,可以为Query生成的代码将在事务中运行:(两种情况)

1. 如果查询的结果相当大,则需要在事务内运行它以接收一致的结果。


2. 如果查询的结果是带有“Relation”的字段,则分别查询这些字段。为了在这些查询之间获得一致的结果,我们需要在单个事务中运行它们。

class ProductWithReviews extends Product {
     @Relation(parentColumn = "id", entityColumn = "productId", entity = Review.class)
     public List<Review> reviews;
 }
 @Dao
 public interface ProductDao {
     @Transaction @Query("SELECT * from products")
     public List<ProductWithReviews> loadAll();
 }

备注:
1. 如果查询是异步查询(例如返回LiveData或RxJava Flowable),在运行查询时(而不是在调用方法时)将需要添加@Transaction。

2. 将此注释放在Insert,Update或Delete方法上没有影响,因为它们始终在事务内运行。同样,如果用Query注释但运行了update或delete语句,则它将自动包装在事务中。

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页