RxJava,Room:使用rxjava链调用更新Db的所有行的最佳方法

时间:2018-09-23 23:29:54

标签: java rx-java rx-java2 android-room

我正在使用rxjava&Room尝试更新db中的行列表。 卡在事件不断触发的循环中

Dao

@Query("SELECT * FROM movies")
Flowable<List<Movie>> getMovies();

@Update
int updateMovie(Movie movie);

UpdateClass -帮助类正在像这样更新Db

// Trying to get all existing movies and update one value in all of them.

@WorkerThread
Flowable<Integer> updateMovies(Helper help) {
    return movieDao.getMovies().flatMapIterable(movies -> movies)
        .flatMap(movie -> {
            LogUtils.debug("movieusecase", "movieid" + movie.getMovieId());
            movie.updateRating(help.getUpdatedVal(movie));
            return Flowable.just(movie);
        }).map(movie -> {
           return movieDao.updateMovie(movie);
        });
}

一旦包含updateMovie调用,我就会陷入无限循环,重复事件不断从房间db传来。

演示者类-调用更新类以更新数据库中的内容。在活动onCreate

中触发
updateClass.updateMovies()
    .observable.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(movie -> {
        // update stuff
    }, throwable -> {
        LogUtils.error(TAG, throwable.getMessage());
    });

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

听起来像Single而不是Flowable的工作。

区别在于Single只会在数据库中的当前电影列表中触发一次,不会像Flowable那样不断发出更改。

Single<List<Movie>> getMovies();

或者如果您出于某种原因希望您的方法返回Flowable,则也可以使用Flowable.firstOrError(),它将Flowable转换为带有{{3 }}。

Single

尽管为了意图清楚起见,我还是选择第一个选项。