正式文件指出:
It is recommended to have multiple Dao classes in your codebase depending on the tables they touch.
并且可以用事务注释标记一个方法,如:
@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合并为一个来支持事务,还是有更好的方法来做到这一点?
发布于 2018-01-10 12:38:30
您可以使用RoomDatabase.runInTransaction(.)
类似于:
database.runInTransaction(new Runnable(){
@Override
public void run(){
Access all your daos here
}
});
发布于 2021-09-21 21:02:28
事实1:在方法上使用@Transaction的导致方法在Dao_Impl生成的类中被覆盖。此方法如下所示:
@Override
public void makeFieldInactive(final long fieldId) {
__db.beginTransaction();
try {
MyDao_Impl.super.makeFieldInactive(fieldId);
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
}
}
事实2: runInTransaction()方法如下所示:
/**
* 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的示例:
@Transaction
public void addItem(ItemEntity item) {
item.setId(insert(item));
ItemReportDao itemReportDao = AppDatabase.getIntance().itemReportDao();
itemReportDao.addItemReport(item.getId());
}
https://stackoverflow.com/questions/48164003
复制相似问题