Вы можете выполнить несколько операций с базой данных в транзакции, используя Android Room.Таким образом, вы гарантируете, что целостность вашей базы данных не будет изменена в случае сбоя одной из этих операций (откат операций).
Вот как вы можете определить транзакцию с комнатой в классе Dao
:
@Dao
public abstract class MyDao {
@Insert
public abstract long insertStore(Store store);
@Insert(onConflict = OnConflictStrategy.ROLLBACK)
public abstract long recordPurchase(Purchase purchase);
@Update
public abstract void updateItem(Item updatedItem);
@Transaction
public void buyItemFromStore(Item boughtItem, Store store) {
// Anything inside this method runs in a single transaction.
long storedId = insertStore(store);
Purchase purchase = new Purchase(storeId);
long purchaseId = recordPurchase(purchase);
item.setPurchaseId(purchaseId);
updateItem(item);
}
}
Вы можете обратиться к документации для объяснения того, как работает @Transaction
.
Затем в своем классе репозитория вызовите buyItemFromStore
изваш AsyncTask
:
public class MyRepository {
private MyDao dao;
public void buy(Item item, Store store) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doOnBackground(Void... voids) {
// Everything is saved in a transaction.
dao.buyItemFromStore(item, store);
return null;
}
}
}
}
Обратите внимание, что для слоя Repository
это прекрасно, если вы знаете о связях между сущностями, если хранимые объекты связаны каким-либо образом (с помощью функции «Покупка из магазина» иПохоже, что это так).
Если вы не можете изменить класс Dao
, рассмотрите RoomDatabase.runInTransaction
.