Android Room database transactions
As pointed out on documentation for Transaction, you can do following:
@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); } }
As @CommonsWare pointed out, @Query are asynchronous , while @Insert , @Delete , @Update are synchronous.
If you want to execute multiple queries in single transaction , Room also provides a method for that as mentioned below.
roomDB.runInTransaction(new Runnable() { @Override public void run() { removeRows(ids); insertRows(ids); } });
I hope this will solve your problem.
For Room transactions in Kotlin you can use:
- Interface with implemented method, like:
@Dao interface Dao { @Insert fun insert(item: Item) @Delete fun delete(item: Item) @Transaction fun replace(oldItem: Item, newItem: Item){ delete(oldItem) insert(newItem) }}
- Or use open function, like:
@Dao abstract class Dao { @Insert abstract fun insert(item: Item) @Delete abstract fun delete(item: Item) @Transaction open fun replace(oldItem: Item, newItem: Item){ delete(oldItem) insert(newItem) }}
You'll get error: Method annotated with @Transaction must not be private, final, or abstract.
without open modifier.