繁体   English   中英

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

[英]How to get Flowable<List<Foo>> from 'Bar' Object with One-to-many relations 'Foo' using realm and Rxjava

假设我有这样的模型类。 我从这里复制。

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

我想我明白了,对我来说,答案就对了。 我想我必须先使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM