我正在使用领域3.4和rx java2。我想要完成的是在将数据插入领域后返回Completable。
public Completable insertSamplesRx(final List<Sample> sampleList) {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
for(Sample s : sampleList) {
realm.insertOrUpdate(sampleList);
}
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
Completable.complete();
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
Completable.error(error);
}
});
}
此代码显然无法编译,因为缺少返回。我如何在这里返回可完成的结果?
由于
答案 0 :(得分:1)
重要的是要记住,在调用subscribe
之前,Rx对象通常不会执行任何操作。
您应该查看Completable.create
,了解如何将“操作”转换为可以完成或导致错误的Completable。
答案 1 :(得分:0)
希望这可以为您提供帮助
public Completable updateChangeSancions(int resultId,int inspetionId, int sanction) {
return Completable.fromAction(() -> {
try (Realm r = Realm.getDefaultInstance()) {
r.executeTransaction(realm -> {
RealmResults<InspeccionDetalle> detalles = realm.where(Inspection.class)
.equalTo("resultId", 1)
.equalTo("inspetionId", resultId)
.findAll();
for (InspeccionDetalle i : detalles) {
i.setPersonalSancios(sanction);
}
});
}
});
}
答案 2 :(得分:0)
我们可以为Realm制作Kotlin扩展功能
fun Realm.completableTransaction(
transactionBlock: (realm: Realm) -> Unit
): Completable {
return Completable.create { completable ->
this.executeTransactionAsync(
Realm.Transaction { transactionRealm: Realm -> transactionBlock(transactionRealm) },
Realm.Transaction.OnSuccess { completable.onComplete() },
Realm.Transaction.OnError { t: Throwable -> completable.onError(t) }
)
}
}
并使用类似
fun save(foo: RealmFoo): Completable {
return realm.completableTransaction { _realm->
foo.name = "bar"
_realm.copyToRealmOrUpdate(fooList)
}
}
这仅在订阅时有效
save(foo)
.subscribe({
// saved
},{
// error
})
答案 3 :(得分:-1)
对于它可能涉及的人,解决方案正在使用from action,如果出现错误则会抛出异常,并强制Completable触发错误。
public Completable insertSamples(final List<Sample> sampleList) {
return Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
realm = Realm.getDefaultInstance();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.insertOrUpdate(sampleList);
}
});
}
});
}
重要的是要注意,不需要显式调用领域实例
java.lang.IllegalStateException:从错误的线程访问Realm。 Realm对象只能在创建它们的线程上访问。