在一次交易中导入多个表的房间

时间:2018-09-14 17:55:29

标签: android kotlin transactions android-room

我有一种情况,我需要在多个表上进行一些插入/更新/删除操作,如果在一个表中的导入失败,我希望能够回滚。 我正在使用RoomDatabase,但是插入方法是在事务中完成的,即使只有一项。

在我的Dao类中插入一个项目的示例:

 @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertOrReplace(obj: Item): Long

然后生成了Java代码:

  @Override
  public long insertOrReplace(Item obj) {
    __db.beginTransaction();
    try {
      long _result = __insertionAdapterOfItem.insertAndReturnId(obj);
      __db.setTransactionSuccessful();
      return _result;
    } finally {
      __db.endTransaction();
    }
  }

我想做的是这样的:

val db = AppDatabase.getInstance().openHelper.writableDatabase
        db.beginTransaction()
            itemDao.insertOrReplace(data.items)
            itemStatisticsDao.insertOrReplace(data.itemStats)
            supplierDao.insertOrReplace(data.suppliers)

        db.setTransactionSuccessful()
        db.endTransaction()

由于dao类的插入方法是在事务中完成的,所以我得到了数据库锁。

我试图将beginTransactionNonExclusive()方法用于相同的结果。

目前我唯一能想到的解决方案是使用openHelper并使用ContentValues手动进行插入...

在Room中有什么方法吗?

0 个答案:

没有答案