RxJava:数据库和远程服务器

弗朗西斯

我有一个要从本地数据库(如果有)或从远程服务器检索的对象列表。我正在使用RxJava Observables(用于数据库的SqlBrite和用于远程服务器的Retrofit)。

我的查询代码如下:

Observable<List<MyObject>> dbObservable = mDatabase
            .createQuery(MyObject.TABLE_NAME,MyObject.SELECT_TYPE_A)
            .mapToList(MyObject.LOCAL_MAPPER);
Observable<List<MyObject>> remoteObservable = mRetrofitService.getMyObjectApiService().getMyObjects();

return Observable.concat(dbObservable, remoteObservable)
    .first(new Func1<List<MyObject>, Boolean>() {
                @Override
                public Boolean call(List<MyObject> myObjects) {
                    return !myObjects.isEmpty();
                }
            });

我看到第一个可观察到的正在运行,并且碰到了一个空列表的第一个方法,但是随后改进的可观察到的不运行,没有网络请求。如果我切换了可观察对象的顺序,或者只是返回了远程可观察对象,则它会按预期工作,它将命中远程服务器并返回对象列表。

为什么远程可观察对象在这种情况下无法运行?当我首先将可观察对象与db连接,然后将其进行改进时,不会调用订户的onNext,orError和onComplete方法。

谢谢!

Kaushik Gopal在他的RxJava-Android-Samples github项目中解决了这个问题

他建议使用此技术:

getFreshNetworkData()
          .publish(network ->
                         Observable.merge(network,
                                          getCachedDiskData().takeUntil(network)))
          .subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(new Subscriber<List<MyObject>() {

              ...
          });

在您的情况下,可能看起来像这样:

remoteObservable
      .publish(network ->
                     Observable.merge(network,
                                      dbObservable.takeUntil(network)))
      .first(myObjects -> !myObjects.isEmpty());

编辑:听起来您可能只需要这个:

dbObservable
    .flatMap(localResult -> {
        if (localResult.isEmpty()) {
            return remoteObservable;
        } else {
            return Observable.just(localResult);
        }
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

连接到远程mysql数据库服务器

RxJava链到数据库和服务器

远程分发数据库和发布服务器之间的MS SQL Server的不同版本

从Postgresql9.1中的数据库功能连接远程服务器数据库

Web应用程序和数据库可以托管在不同的服务器(远程和本地)上吗?

数据库服务器,分区和实例

航海者数据库和 MariaDB 服务器

分离 Alfresco 服务器和 postgresql 数据库

如何通过plesk面板管理数据库服务器和Web服务器

django:如何使用django数据库设置在远程服务器上使用Fabric引导/创建数据库

服务器与数据库通信

Java服务器数据库

在Rails应用中连接远程数据库服务器失败

可以将远程数据库导出/导入到WAMP服务器吗?

将本地机器上的 SSIS 连接到远程服务器 oracle 数据库

使用PHP从Linux服务器连接到远程MS SQL数据库

Android与MSSQL远程服务器同步SQLite数据库

配置远程MySQL数据库时,Openfire XMPP服务器错误

连接远程Scylla数据库服务器显示错误

我可以从Docker容器内部连接到远程数据库服务器吗?

如何访问Oracle Apex中远程服务器上存在的数据库表

安装Visual Studio 2012后无法连接任何远程数据库服务器

当端口5432被阻止时,来自远程服务器的pg_dump postgres数据库

连接到远程服务器并执行简单的数据库查询时出现问题

从Android向远程服务器数据库发送查询的正确方法

远程服务器上的C#数据库连接错误

用户凭据的远程数据库的Datasnap服务器身份验证问题

如何从Godaddy托管的远程服务器访问本地MySql数据库

在 Android 中将 Sqlite 数据库与远程服务器同步