我一直在浏览领域文档,发现没有可行的方法可以从事务“主体”即Realm.Transaction.execute()
中取消异步事务。因此,如果我想使用executeTransactionAsync() API,我似乎唯一的求助方法就是:
realm.executeTransactionAsync(
new Realm.Transaction() {
@Override
public void execute(@NonNull Realm realm) {
// pretend we have some inter dependent database operations here
if (failureCondition) {
throw new Error("Failed transaction");
}
// and more here...
}
},
new Realm.Transaction.OnError() {
@Override
public void onError(@NonNull Throwable error) {
Log.e(LOG_TAG, error.getMessage());
}
}
);
真的没有更好的方法吗?如果对操作进行重新排序以使简单的退货就足够了,并且可以部分落实交易,那么这显然是我会做的选择,但是如果我做不到,该怎么办。
当然,以上内容在技术上与在execute()中仅调用realm.cancelTransaction()
相同,因为它会导致尝试提交不再存在的事务以引发异常。但是,从以下事实来看,这个漂亮的API背后的实际异步事务代码在尝试提交之前不与realm.isInTransaction()
进行检查,也不允许execute()抛出任何检查的异常,这两种方法似乎都不是设计人员甚至考虑的事情有效的用例。
我想最后我会回答自己,所以也许更好的问题是……这是API本身的设计上的问题还是我只是在尝试做一些根本上错误的事情。