【问题标题】:convert Observable<RealmResults<T>>> into Observable<List<T>>>将 Observable<RealmResults<T>>> 转换为 Observable<List<T>>>
【发布时间】:2016-04-26 19:42:23
【问题描述】:

我尝试使用 Realm 和 RxJava 实现模式存储库。仓库接口有这样的签名

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 没有实现 List 接口吗?
  • @JohnWowUs 是的。但我想应该有更好的方法来做到这一点。我想是的,你指的是new ArrayList&lt;Plant&gt;(Arrays.asList(realmResults.toArray()))。对吗?
  • 没有。我的意思是 RealmResults 已经实现了 List。在here 查找课程。注意 List 是一个接口而不是一个类。

标签: android realm rx-java


【解决方案1】:

在观看了 Dan Lew 关于Common RxJava Mistakes (mistake flattening list) 的会议后,我发现了一个与此案例相关的常见错误。

所以,本案例的解决方案如下。

realmResults.flatMap(list ->
            Observable.from(list)
                    .map(plantRealm -> toPlant.map(plantRealm))
                    .toList())

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

如果我想从其他线程访问领域对象,我会遇到此解决方案的问题。我可以像这样解决其他极端情况,但我仍然坚持这个。

我解决了这个...

【讨论】:

  • 这有时会返回空列表
【解决方案2】:

您可以执行以下操作:

public Observable<List<AllTypes>> getList() {
  Observable<RealmResults<AllTypes>> obs = realm.where(AllTypes.class).findAll().asObservable();
  return (Observable) obs;
}

【讨论】:

  • 看看我的回答,让我知道你的想法。感谢您的宝贵时间。
【解决方案3】:
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);
                    });
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多