【问题标题】:How to chain queries with rxjava and room如何使用 rxjava 和 room 链接查询
【发布时间】:2020-05-26 12:46:06
【问题描述】:

我需要填写对象的字段才能将其发布到 API。

我正在使用 rxjava 和 room,但我的订单链失败了

我的道

    @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 被调用时,它应该有一个口袋妖怪列表,每个口袋妖怪都应该有他们的笔记

谢谢

【问题讨论】:

  • 也许你应该试试one-to-many relations in Room。它似乎可以给你你想要的东西,而不需要对数据进行这种操作
  • 我有两个课程:口袋妖怪和笔记。所以每个口袋妖怪都可以有一个相关的笔记列表。我不认为我有你建议的“房间中的一对多关系”@sergiytikhonov
  • 我刚刚提到了另一种方式,您可以考虑一下。为此,您需要 3 个类 - Pokemon(无列表)、Note 和 PokemonWithList(这将是一对多关系)。后一个类必须是普通类,不与 SQLite 关联。详细信息和示例在上面的文档链接中。但是您可以按照自己的方式进行操作)我个人认为将值列表保存在表格列中不是很干净,但这是一个品味问题
  • 感谢@sergiytikhonov 的帮助。如果我创建类 PokemonWithList ,我仍然需要调用 1 个查询来获取所有的口袋妖怪,然后调用一个查询来获取我拥有的每个口袋妖怪的注释。我想要实现的是如何通过链接查询来使用 Rxjava 获取所有这些信息。因为首先需要得到口袋妖怪,并且每个口袋妖怪 id 都会得到他们的笔记
  • 添加了一个答案,因为在评论中写得太长了。这与我上面提到的文章中的概念相同,但与您的课程相同

标签: java android rx-java android-room


【解决方案1】:

下面我描述了在没有 RxJava 的情况下完成任务的 Room-ish 方式

假设您有这些实体:

@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();

此方法的房间订单可同时获取口袋妖怪和便笺并将它们连接起来(无需两次查询)

使用此方法,您将获得包含口袋妖怪和笔记的列表。

【讨论】:

  • 谢谢,我以非常不正确的方式解决了这个问题。将近3天为此苦苦挣扎。非常感谢 @sergiytikhonov 的帮助。
猜你喜欢
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
相关资源
最近更新 更多