Realm在与RxJava的事务中复制对象的正确方法

时间:2016-08-04 12:14:45

标签: android realm rx-java

目前,在将值复制到域时,我会执行以下操作:

Observable<Home>

然后我可以访问侦听器内新添加的对象。什么是正确的RxJava完成相同的方式?观察者必须返回 return Observable.just(homeItem) .map { (HomeItem homeItem) -> return AnotherHomeItem(homeItem.xxx, homeItem.yyy) } .flatMap { (AnotherHomeItem anotherItem) -> realm.beginTransaction() val newItem = realm.copyToRealm(anotherItem).asObservable< AnotherHomeItem >() realm.commitTransaction() return newItem } .filter { return it.isLoaded } ,这是realmCopy而不是原始对象。可以任意1请提供样品吗?

通过这样做来管理让它工作,但我不确定这是最好的方法......推荐的方法是什么?

{{1}}

1 个答案:

答案 0 :(得分:2)

您应该在后台线程上写入Realm,并在UI线程上使用不同的订阅进行观察。

您在后台线程上保留一个订阅:

public Subscription downloadObjectsFromNetwork() {
    return objectApi.getObjects()
        .subscribeOn(Schedulers.io())
        .subscribe(response -> {
            try(Realm realmInstance = Realm.getDefaultInstance()) {
                realmInstance.executeTransaction(realm -> realm.insertOrUpdate(response.objects));
            }
        });
}

你在UI线程上用asObservable()阅读:

public Subscription readFromRealm() {
    return realm.where(SomeObject.class)
         .findAllAsync()
         .asObservable()
         .subscribeOn(AndroidSchedulers.mainThread())
         .observeOn(AndroidSchedulers.mainThread())
         .filter(RealmResults::isLoaded)
         .subscribe(objects -> adapter.updateData(objects));
}

将Realm与RxJava一起使用

对于查询,Realm提供realmResults.asObservable()方法。只能在looper线程(通常是UI线程)上观察结果。

要使其正常工作,您的配置必须包含以下内容

realmConfiguration = new RealmConfiguration.Builder(context)       //
                          .rxFactory(new RealmObservableFactory()) //
                             //...
                          .build();

之后,您可以将结果用作可观察的结果。

Observable<RealmResults<SomeObject>> observable = results.asObservable();

对于异步查询,您应该按isLoaded()过滤结果,以便仅在查询执行时才收到事件。同步查询不需要filter() isLoaded()始终在同步查询中返回true

    Subscription subscription = RxTextView.textChanges(editText).switchMap(charSequence -> 
        realm.where(SomeObject.class)
             .contains("searchField", charSequence.toString(), Case.INSENSITIVE)
             .findAllAsync()
             .asObservable())
    .filter(RealmResults::isLoaded) //
    .subscribe(objects -> adapter.updateData(objects));

对于写入,您应该使用executeTransactionAsync()方法,或者在后台线程上打开Realm实例,同步执行事务,然后关闭Realm实例。

public Subscription loadObjectsFromNetwork() {
    return objectApi.getObjects()
        .subscribeOn(Schedulers.io())
        .subscribe(response -> {
            try(Realm realmInstance = Realm.getDefaultInstance()) {
                realmInstance.executeTransaction(realm -> realm.insertOrUpdate(response.objects));
            }
        });
}