Управляйте несколькими источниками данных - PullRequest
0 голосов
/ 09 июля 2020

Я работаю над социальным приложением, например Instagram и LinkedIn , и я не понимаю, как управлять несколькими источниками данных (roomLocalDataSource, remoteDataSource).

Я хочу загружать данные непосредственно из roomLocalDataSource после открытия приложения и отображать их в RecyclerView, если они существуют, также получать данные из remoteDataSource и при успехе показывать кнопку пользователю для отображения новых сообщений, например, механизм происходит в Instagram и LinkedIn ,

Вот мой RemoteDataSource:

public Single<List<Movie>> getMoviesFromRemote() {
      return moviesApiService.getMovies();
}

Вот мой RoomLocalDataSource:

public Single<List<Movie>> getMoviesFromLocal() {
      return moviesDao.getMovies();
}

Вот мой MoviesDao:

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

Вот мой MoviesApiService:

@GET("movies")
Single<List<Movie>> getMovies();

Вот мой MoviesRepository:

public List<Movie> getMovies() {
      // Here i will get data using (roomLocalDataSource, remoteDataSource) and send to viewModel
}

Я пробовал оператор concat для обработки двух источников данных, но rnet я получаю данные только с удаленного устройства, а не с локального.

Я знаю, что вызов будет обрабатываться операторами RX Java но я не знаю, какой именно оператор c может мне помочь в моем случае.

Ответы [ 2 ]

0 голосов
/ 24 июля 2020

В своем MoviesRepository вы можете сначала получить данные из своего RoomLocalDataSource и объединить с RemoteDataSource

public Flowable<Movie> getMovies() {
      return roomLocalDataSource.getMoviesFromLocal()
                .concatWith(remoteDataSource.getMoviesFromRemote());
}

Затем вы подписываетесь на Flowable, и ваш метод onNext будет вызываться дважды, сначала время со списком, возвращенным Room, и второй раз со списком, полученным из вашего удаленного источника данных

public class MoviesSubscriber extends DisposableSubscriber<List<Movie>>(){
    @Override
    public void onNext(List<Movie> movies) {
        // TODO: handle the list
    }

    @Override
    public void onError(Throwable t) {
        // ...
    }

    @Override
    public void onComplete() {
        // ...
    }
}
0 голосов
/ 12 июля 2020

Вы можете сделать что-то вроде кода ниже

getMoviesFromLocal()
    .doOnSuccess(localData -> //Update the UI)
    //Now fetch from Remote
    .flatMap(
        //Get movie list from remote, map to new List with Local and remote movie
        localData -> getMoviesFromRemote().map(remoteData -> Collections.addAll(localData, remoteData)
    )
    .subscribe(
        result -> //List of Movies from remote and Local,
        error -> //Handle error
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...