У меня есть сценарий, в котором мне нужно выполнить импорт с некоторыми вставками / обновлениями / удалениями для нескольких таблиц, и если импорт в одну из таблиц завершится неудачно, я хочу иметь возможность выполнить откат.
Я использую 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 ...
Есть ли способ сделать это в комнате?