RxJava, Room: Лучший способ обновить все строки базы данных с помощью цепных вызовов rxjava - PullRequest
0 голосов
/ 24 сентября 2018

Я использую rxjava & Room, где пытаюсь обновить список строк в БД.Застрял в цикле, где события непрерывно запускаются

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, я зацикливаюсь на бесконечном цикле, где повторяющиеся события продолжают поступать из комнаты базы данных.

Presenter Class - обновление вызововкласс для обновления вещей в БД.Приводится в действие onCreate

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

Заранее спасибо, любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 24 сентября 2018

Звучит как работа для Single вместо Flowable.

Разница в том, что Single будет срабатывать только один раз с текущим списком фильмов в БД, он не сохранитсявыдает изменения, как Flowable.

Single<List<Movie>> getMovies();

Или, если по какой-то причине вы хотите, чтобы ваш метод возвратил Flowable, вы также можете использовать Flowable.firstOrError(), который преобразует ваш Flowable в Single с стоимостью .

@WorkerThread
Flowable<Integer> updateMovies(Helper help) {
    return movieDao.getMovies()
        .firstOrError()
        .flatMapIterable(movies -> movies)
        .flatMap(movie -> { ... })
        .map(movie -> { ... });
}

Я предпочитаю первый вариант, хотя ради ясности намерения.

...