如何使用 <Foo>realm 和 Rxjava 从具有一对多'Foo'关系'Bar'对象获取 Flowable<List>



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

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

最新更新