首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理多个数据源

管理多个数据源
EN

Stack Overflow用户
提问于 2020-07-09 14:43:56
回答 2查看 99关注 0票数 0

我正在开发像InstagramLinkedIn这样的社交应用程序,我很困惑如何管理多个数据源( roomLocalDataSourceremoteDataSource )。

我希望在打开应用程序后直接从roomLocalDataSource加载数据,并在RecyclerView中显示数据,如果存在,还可以从remoteDataSource和“成功显示”按钮获得数据,以显示新的帖子,如InstagramLinkedIn中的机制。

这是我的RemoteDataSource

代码语言:javascript
复制
public Single<List<Movie>> getMoviesFromRemote() {
      return moviesApiService.getMovies();
}

这是我的RoomLocalDataSource

代码语言:javascript
复制
public Single<List<Movie>> getMoviesFromLocal() {
      return moviesDao.getMovies();
}

这是我的MoviesDao

代码语言:javascript
复制
@Query("SELECT * FROM movies)
Single<List<Movie>> getMovies();

这是我的MoviesApiService

代码语言:javascript
复制
@GET("movies")
Single<List<Movie>> getMovies();

这是我的MoviesRepository

代码语言:javascript
复制
public List<Movie> getMovies() {
      // Here i will get data using (roomLocalDataSource, remoteDataSource) and send to viewModel
}

我尝试过concat操作员来处理两个数据源,但是我只从远程获取数据,而没有从本地获取数据。

我知道调用是由RXJava操作符处理的,但在我的情况下,我不知道哪个特定的操作符可以帮助我。

EN

回答 2

Stack Overflow用户

发布于 2020-07-12 04:09:11

您可以执行类似于以下代码的操作

代码语言:javascript
复制
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
    )
票数 0
EN

Stack Overflow用户

发布于 2020-07-23 21:05:13

在您的MoviesRepository中,您可以首先获取RoomLocalDataSource中的数据并与RemoteDataSource连接

代码语言:javascript
复制
public Flowable<Movie> getMovies() {
      return roomLocalDataSource.getMoviesFromLocal()
                .concatWith(remoteDataSource.getMoviesFromRemote());
}

然后订阅可流动的,您的onNext方法将被调用两次,第一次调用由Room返回的列表,第二次调用从远程数据源获取的列表

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62817478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档