Как обрабатывать транзакции 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();
});
}