如何获得Flowable <list <foo>&gt;来自&#39; Bar&#39;具有一对多关系的对象&#39; Foo&#39;使用领域和Rxjava

时间:2017-11-01 15:30:07

标签: java android kotlin realm rx-android

假设我有这样的模型类。 I copy from here.

open class Person(
        @PrimaryKey var id: Long = 0,
        var name: String = "",
        var age: Int = 0,
        var dog: Dog? = null,
        var cats: RealmList<Cat> = RealmList(),

) : RealmObject() {

}

有很多人,每个人都有一只或多只猫。

我的问题是如何获得Flowable<List<Cat>>或类似(人们拥有的每只猫)。从这个可流动的列表中,我想列出每只猫(按名称排序)并使用RecyclerView.Adapter显示。请帮我看看如何实现猫咪名单。谢谢。

到目前为止,我只能通过使用以下内容获得Flowable<Cat>

mRealm.where(Person::class.java)
                .findAllAsync().asFlowable()
                .filter { p -> p.isLoaded }
                .flatMap { p -> Flowable.fromIterable(p).flatMap { b -> Flowable.fromIterable(b.cats) } 

2 个答案:

答案 0 :(得分:0)

open class Cat : RealmObject() {
    var name: String? = null

    @LinkingObjects("cats")
    val owners : RealmResults<Person>? = null;
}

RealmResults<Cat> ownedCats = realm.where(Cat::class.java)
                                   .isNotEmpty("owners")
                                   .findAllAsync()...

答案 1 :(得分:0)

我想我得到了它,我认为答案对我来说。我想我必须首先使用map,然后使用flatMap作为列表展平并收集并对它们进行排序。这是一个带有调试输出的简单程序,用于显示我如何获得Flowable<List<Cat>>

    mRealm.executeTransaction {
        val person = mRealm.createObject(Person::class.java, 1)
        person.name = "John"

        val firstCat = mRealm.createObject(Cat::class.java)
        firstCat.name = "Kitty"
        person.cats.add(firstCat)

        val secondCat = mRealm.createObject(Cat::class.java)
        secondCat.name = "Ashes"
        person.cats.add(secondCat)
    }

    mRealm.executeTransaction {
        val person = mRealm.createObject(Person::class.java, 2)
        person.name = "Bob"

        val firstCat = mRealm.createObject(Cat::class.java)
        firstCat.name = "Daisy"
        person.cats.add(firstCat)

        val secondCat = mRealm.createObject(Cat::class.java)
        secondCat.name = "Missy"
        person.cats.add(secondCat)
    }

    val flowableListOfCat: Flowable<List<Cat>> = mRealm.where(Person::class.java)
            .findAllAsync().asFlowable()
            .filter { person -> person.isLoaded }
            .map { p -> p.flatMap { a -> a.cats }.sortedBy { c -> c.name } }

    flowableListOfCat
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe { catList -> catList.forEach { cat -> Log.d("Cat", "" + cat.name) } }

在调试输出时, D/Cat: Ashes D/Cat: Daisy D/Cat: Kitty D/Cat: Missy