1

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

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 是否安全?如果没有,会出现什么问题?

4

1 回答 1

1

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

try(Realm r = Realm.getDefaultInstance()) {
    r.executeTransaction((realm) -> {
        workWithRealmData();
    });
}
于 2017-02-27T22:03:52.687 回答