首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >跨DAOs的Android房间事务

跨DAOs的Android房间事务
EN

Stack Overflow用户
提问于 2018-01-09 08:24:02
回答 2查看 9K关注 0票数 42

正式文件指出:

代码语言:javascript
运行
复制
It is recommended to have multiple Dao classes in your codebase depending on the tables they touch.

并且可以用事务注释标记一个方法,如:

代码语言:javascript
运行
复制
 @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);
     }
 }

但是,如果一个事务跨越多个DAO怎么办?我应该将所有DAO合并为一个来支持事务,还是有更好的方法来做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-10 12:38:30

您可以使用RoomDatabase.runInTransaction(.)

类似于:

代码语言:javascript
运行
复制
database.runInTransaction(new Runnable(){
  @Override
  public void run(){
    Access all your daos here
  }
});
票数 37
EN

Stack Overflow用户

发布于 2021-09-21 21:02:28

事实1:在方法上使用@Transaction的导致方法在Dao_Impl生成的类中被覆盖。此方法如下所示:

代码语言:javascript
运行
复制
  @Override
  public void makeFieldInactive(final long fieldId) {
      __db.beginTransaction();
      try {
          MyDao_Impl.super.makeFieldInactive(fieldId);
          __db.setTransactionSuccessful();
      } finally {
          __db.endTransaction();
      }
  }

事实2: runInTransaction()方法如下所示:

代码语言:javascript
运行
复制
/**
 * Executes the specified {@link Runnable} in a database transaction. The transaction will be
 * marked as successful unless an exception is thrown in the {@link Runnable}.
 * <p>
 * Room will only perform at most one transaction at a time.
 *
 * @param body The piece of code to execute.
 */
@SuppressWarnings("deprecation")
public void runInTransaction(@NonNull Runnable body) {
    beginTransaction();
    try {
        body.run();
        setTransactionSuccessful();
    } finally {
        endTransaction();
    }
}

结论:两人都做同样的事情。

More Info:,我已经做了一些测试,似乎使用它们中的任何一个(或冗余)将成功地使您的you方法在一个事务中运行。

答案:使用@Transaction对访问相同数据库的多个Daos进行更改的是确保该方法中发生的所有数据库操作都发生在一个事务中的安全方法。

编辑:在一个标记为@Transactoin的方法中访问multipe的示例:

代码语言:javascript
运行
复制
@Transaction
 public void addItem(ItemEntity item) {
        item.setId(insert(item));
        ItemReportDao itemReportDao = AppDatabase.getIntance().itemReportDao();
        itemReportDao.addItemReport(item.getId());
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48164003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档