转换Observable <realmresults <t>&gt;&gt;进入Observable <list <t>&gt;&gt;

时间:2016-04-26 19:42:23

标签: android realm rx-java

我尝试使用Realm和RxJava实现模式Repository。存储库界面有这样的签名

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

因此,当我使用Realm并想要检索结果&#34; asObservable&#34;时,我得到Observable&gt;。我找不到改变Observable的方法&gt;进入Observable&gt;。

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

我试过这样的

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();
   });

3 个答案:

答案 0 :(得分:2)

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

因此,此案例的解决方案如下。

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

此视频非常棒,我强烈建议您观看。

如果我想从其他Thread访问realm对象,我遇到此解决方案的问题。我可以解决这样的其他角落案例,但我仍然坚持这一点。

code

console

我解决了这个......

resolved

答案 1 :(得分:0)

您可以执行以下操作:

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

答案 2 :(得分:0)

try:
    pw_length_ask = int(raw_input("How long would you like your password to be? "))
    final_pw_length = pw_length + int(pw_length_ask.strip())
    print("Pass length set to " + str(final_pw_length))
except ValueError:
    print("You must enter a number.")
    int(raw_input("How long would you like your password to be? "))