Как обрабатывать транзакции Realm на Android

В нескольких примерах кода я видел шаблоны, которые выглядят так:

try (Realm realm = Realm.getDefaultInstance()) {
  realm.beginTransaction();
  workWithRealmData();
  realm.commitTransaction();
}

Вопрос - это безопасно? Если функция "workWithRealmData()" генерирует исключение, транзакция не будет отменена. Но мы в любом случае закрываем Царство в конце попытки использования ресурсов.

Более безопасная конструкция может выглядеть следующим образом:

try (Realm realm = Realm.getDefaultInstance()) {
  realm.beginTransaction();
  try {
    workWithRealmData();
    realm.commitTransaction();
  } finally {
    if (realm.isInTransaction()) {
      realm.cancelTransaction();
    }
  }
}

Это выглядит безопаснее, но также выглядит значительно более неприятным для кода для всех сайтов вызовов.

Так что на самом деле все сводится к тому, безопасно ли игнорировать cancelTransaction, если область сразу же закрывается, или нет? Если нет, то что может пойти не так?

1 ответ

Решение

Ты можешь использовать executeTransaction(Realm.Transaction) метод, который автоматически отменяет синхронную транзакцию в случае ошибки.

try(Realm r = Realm.getDefaultInstance()) {
    r.executeTransaction((realm) -> {
        workWithRealmData();
    });
}
Другие вопросы по тегам