Android Room database transactions Android Room database transactions android android

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.