将Observable<RealmResults<T>>>转换为Observable<List<T>>>

7

我希望你能够使用Realm和RxJava实现仓储模式(Repository Pattern)。仓储接口的签名如下:

Observable<List<T>> query(Specification specification);

因此,当我使用Realm并想要检索结果“asObservable”时,我会得到Observable>。我找不到一种将Observable>转换为Observable>的方法。

有人能帮忙解决这个问题吗?

我尝试过类似于这样的东西

final Observable<RealmResults<PlantRealm>> realmResults = realm.where(PlantRealm.class)
               .equalTo(PlantTable.ID, "1")
               .findAll().asObservable();

// convert Observable<RealmResults<PlantRealm>> into Observable<List<PlantRealm>>

    return realmResults.flatMap(Observable::from).toList().map(list -> {

                for (PlantRealm plantRealm : list) {
                    plants.add(toPlant.map(plantRealm));
                }
                return Observable.from(plants);
            }
    );

但是类型检查系统仍在抱怨...
return Observable.create( subscriber -> {

       final Realm realm = Realm.getInstance(realmConfiguration);
       final RealmResults<PlantRealm> realmResults = realm.where(PlantRealm.class)
               .equalTo(PlantTable.ID, "1")
               .findAll();

       final List<Plant> plants = new ArrayList<>();

       for (PlantRealm plantRealm : realmResults) {
           plants.add(toPlant.map(plantRealm));
       }

       realm.close();

       subscriber.onNext(plants);
       subscriber.onCompleted();
   });

RealmResults<T>没有实现List<T>接口吗? - JohnWowUs
@JohnWowUs 是的。但我想应该有更好的方法来做这件事。你是指 new ArrayList<Plant>(Arrays.asList(realmResults.toArray())) 吗? - Ignacio Giagante
不,我的意思是RealmResults<T>已经实现了List<T>。在这里查找该类。请注意,List<T>是一个接口而不是一个类。 - JohnWowUs
3个回答

2
观看了Dan Lew关于常见RxJava错误的演讲(列表拍平的错误)后,我发现了一个与此相关的常见错误。
因此,这种情况的解决方案如下。
realmResults.flatMap(list ->
            Observable.from(list)
                    .map(plantRealm -> toPlant.map(plantRealm))
                    .toList())

这段话的英译中文如下:

这个视频非常棒,我强烈推荐观看。

如果我想从其他线程访问领域对象,我会遇到问题。我可以解决其他一些问题,但是这个问题仍然困扰着我。

code

console

我解决了这个问题。

resolved


有时候这会返回一个空列表 - Mladen Rakonjac

0
return Single.create( e -> {
            ArrayList<SomeModel> arrayList = new ArrayList<>();
            realm.where(SomeModel.class)
                    .findAllSortedAsync("createdOn", Sort.DESCENDING)
                    .asObservable()
                    .filter(RealmResults::isLoaded)
                    .subscribe(someModelsAsRealmResult -> {
                        arrayList.addAll(someModelsAsRealmResult);
                        e.onSuccess(arrayList);
                    });
        });

0
你可以执行以下操作:
public Observable<List<AllTypes>> getList() {
  Observable<RealmResults<AllTypes>> obs = realm.where(AllTypes.class).findAll().asObservable();
  return (Observable) obs;
}

请查看我的答案并告诉我您的想法。感谢您的时间。 - Ignacio Giagante

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接