Cómo get Flowable <List <Foo >> del object 'Bar' con relaciones de uno a muchos 'Foo' usando el reino y Rxjava

Digamos que tengo una class model como esta. Copio desde aquí.

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

Hay muchas personas y cada persona tiene uno o más gatos.

Mi pregunta es cómo get Flowable<List<Cat>> o similar (todos los gatos que la gente posee). De esta list fluida, quiero enumerar todos los gatos (orderados por nombre) y mostrarlos con RecyclerView.Adapter. Por favor, ayúdame a cómo lograr la list de gatos. Gracias.

Hasta ahora solo puedo get Flowable<Cat> usando lo siguiente.

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

Creo que lo obtuve y creo que la respuesta es para mí. Creo que primero tengo que usar el map, luego flatMap para aplanarlo como una list y reunirlos y clasificarlos de nuevo. Aquí hay un progtwig simple con salida de debugging para mostrar cómo obtengo el 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) } } 

En la salida de debugging, D/Cat: Ashes D/Cat: Daisy D/Cat: Kitty D/Cat: Missy

  • Lista mutable de Obersable <Object> espere hasta que todos terminen y combínelos en una list <Object>
  • ¿Cómo iterar sobre Single <List> y asignar a otra list?
  • Cómo get el valor del ObservableField en android
  • ¿Cómo puedo agregar de manera condicional una operación asincrónica en medio de una transmisión de RxJava?
  • Operador RxJava para el método de conmutación
  • rx.Scheduler no se puede proporcionar sin un método @ Provides- o @ Produces-anotado
  • ¿Cómo get respuesta en la retroadaptación al usar rxAndroid?
  • OnComplete nunca se llamó con toSortedList () y groupBy ()
  • ¿Cuándo no usar el Observable de RxJava?
  • ¿Cómo convertir muchas AsyncTasks a Rx Observables en Android?
  • RxKotlin - matriz de observadores dynamics