在域异步事务执行后返回Completable

时间:2017-07-08 13:10:04

标签: android rx-java2 realm-mobile-platform

我正在使用领域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);
        }
    });
}

此代码显然无法编译,因为缺少返回。我如何在这里返回可完成的结果?

由于

4 个答案:

答案 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对象只能在创建它们的线程上访问。