Как связать запросы с rx java и комнатой - PullRequest
0 голосов
/ 26 мая 2020

Мне нужно заполнить поля объекта, чтобы опубликовать его в API.

Я использую rx java и комнату, но моя цепочка заказов не работает

My daos

    @Dao
abstract public class PokemonDao implements BaseDao<Pokemon>{
    @Query("SELECT * FROM pokemons ORDER BY id ASC")
    abstract public Flowable<List<Pokemon>> getAll();
}

    @Dao
abstract public class NoteDao implements BaseDao<Note>{


    @Query("SELECT * FROM notes WHERE idPokemon = :idPokemon ORDER BY registerDate DESC")
    abstract public Flowable<List<Note>> getNotes(int idPokemon);
}

Мне нужно создать объект, содержащий данные покемона со списком связанных заметок

Я сделал следующее на моей модели просмотра

            pokemonRepository.getFavourites()
                    .toObservable()
                .flatMap(new Function<List<Pokemon>, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(List<Pokemon> favourites) throws Exception {
                        return Observable.fromIterable(favourites);
                    }
                })
    .flatMap(new Function<Object, ObservableSource<?>>() {
                @Override
                public ObservableSource<?> apply(Object o) throws Exception {
                    return getNotesObservable((Favourite) o);
                }
            })
    .toList()
.toObservable()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())

                    .subscribeWith(new SingleObserver<List<Object>>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onSuccess(List<Object> objects) {

                }

                @Override
                public void onError(Throwable e) {

                }
            })

Я тоже использую этот метод

private Observable<Object> getNotesObservable(Pokemon favourite) {


    Observable<Object> lolo = noteRepository.getNotes(Integer.parseInt(favourite.getId()))
            .map(new Function<List<Note>, Object>() {
                @Override
                public Favourite apply(List<Note> notes) throws Exception {
                    favourite.notesList= notes;
                    return favourite;
                }
            })
            .toObservable();

    return lolo;

}

Моя проблема в том, что в subscribeWith метод onNext никогда не вызывается. Моя цель состоит в том, чтобы при вызове onNext у него был список покемонов, и у каждого покемона были свои записи

Спасибо

1 Ответ

1 голос
/ 27 мая 2020

Ниже я описываю Room-i sh способ решения вашей задачи без Rx Java

Допустим, у вас есть следующие сущности:

@Entity
public class Pokemon {
    @PrimaryKey public int id;
    public String name;
    // other fields
    ........
}

@Entity
public class Note {
    @PrimaryKey public int noteId;
    public int pokemonId;
    // other fields
    ........ 
}

Затем вы можете добавить еще один класс ( это просто класс, не связанный с SQLite):

public class PokemonWithNotes {
    @Embedded public Pokemon pokemon; // here you'll get your pokemon
    @Relation(
         parentColumn = "id",
         entityColumn = "pokemonId"
    )
    public List<Note> notesList; // here you'll het your notes' list
}

и добавьте метод в свой dao:

@Transaction
@Query("SELECT * FROM Pokemon")
public List<PokemonWithNotes> getPokemonListWithNotes();

Заказы помещения к этому методу, чтобы получить как Pokemons, так и Notes и связать их (без двух запросов)

Используя этот метод, вы получите свой список с покемонами и примечаниями.

...