Импорт комнаты из нескольких таблиц в одной транзакции - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть сценарий, в котором мне нужно выполнить импорт с некоторыми вставками / обновлениями / удалениями для нескольких таблиц, и если импорт в одну из таблиц завершится неудачно, я хочу иметь возможность выполнить откат. Я использую RoomDatabase, но методы вставки выполняются в транзакциях, даже когда есть только один элемент.

Пример с вставкой одного предмета в мой класс Дао:

 @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 ​​...

Есть ли способ сделать это в комнате?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...