如何在 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();
});
}
在几段示例代码中,我看到了如下所示的模式:
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();
});
}