如何在 Android 上处理 Realm 事务

How to handle Realm transactions on Android

在几段示例代码中,我看到了如下所示的模式:

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

问题是 - 这样安全吗?如果 "workWithRealmData()" 函数抛出异常,交易不会被取消。但是无论如何我们都会在 try-with-resources 的最后关闭 Realm。

更安全的构造可能如下所示:

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

这看起来更安全 - 但对于所有调用站点的编码看起来也更难处理。

所以这实际上归结为 - 如果 Realm 之后立即关闭,忽略 cancelTransaction 是否安全?如果没有,会出什么问题?

您可以使用executeTransaction(Realm.Transaction)方法,在出现错误时自动取消同步事务。

try(Realm r = Realm.getDefaultInstance()) {
    r.executeTransaction((realm) -> {
        workWithRealmData();
    });
}