当前位置: 首页 > 知识库问答 >
问题:

为什么房间DAO的Flowable方法从未完成?

澹台权
2023-03-14

从DB获取数据,Room DAO有一个返回Flowable userDao.getInfo()的方法,这个Flowable永远不会完成,我测试了添加doOnNext()它会发出5次(DB包含5个项目),但永远不会调用完成,但我需要因为我有toList(),什么可能是这个的替代方案

return userDatas()
    .flatMapIterable(items -> items)
    .flatMap(userData -> userDao.getInfo(userData.getId())
        .map(user -> user.toStoreModel(...)//added doOnNext()-works 5 times and doOnComplete()doesn't work
  .doOnNext(userData -> Log.i("test",""+userData))
    .doOnComplete(() -> Log.i("test","complete"))
        .toList()
        .map(UserModel::fromUserModels)
        .toFlowable();


@Query("SELECT * FROM user WHERE id = :id") 
Flowable<...> getInfo(Long Id);

  public Flowable<List<UserStore>> userDatas() {
return userDao.allUserDatas()
    .take(1)//added complete and next works 
    .filter(userDatas -> !userDatas.isEmpty())
    .switchIfEmpty(userIds()
        .doOnNext(userDatas -> userDao.insert(userDatas)));

 }

我已经测试过了,即使我只用userD替换userDatas()ao.allUserDatas()(我确信它存在于DB中),它也会给出相同的结果

共有3个答案

山疏珂
2023-03-14

理想情况下,您应该修复userDao,以便它正常完成。如果由于某种原因无法完成,可以将其超时并将错误映射为空,强制按如下方式完成:

userDao.getInfo(userData.getId())
   .timeout(1, TimeUnit.SECOND)
   .onErrorResumeNext(Observable.empty())
楚承天
2023-03-14

您的代码一切正常,它永远不会完成Db Flowables是可观察的,所以如果数据库发生更改,它们会一直侦听,所以它永远不会完成。

公冶高义
2023-03-14

如果需要调用complete方法,可以使用take(1)。但在这种情况下,您无法侦听进一步的DB更改

 类似资料:
  • 当我试图构建我的应用程序时,我遇到了以下编译错误: 持久性模块在Android设置中是独立的。 建筑格拉德尔 ext.androidXRoom=“2.1.0-alpha02” 我试着把kotlin版本,room版本,改回AndroidArch room,但没用。我还尝试了清理项目和使Android Studio的缓存失效。但它不起作用。 编辑:AppDatabase源

  • 给定如下所示的房间数据库DAO: 是否有一种方法可以在中添加一个记录器或类似的东西,这样我就可以看到哪些语句正在执行。这在开发过程中非常有用,因为我可以立即检查函数是否正确地转换为预期的SQL语句。

  • 我正在用Firebase和Angular5构建一个web应用程序。我想创建/加入私人房间(受密码保护)。 目前,我正处于数据库设计阶段,无法真正了解如何在不从firebase数据库中实际检索的情况下检查用户输入的正确房间密码(从而使其完全不安全)。 我应该为此使用云功能吗。或者直接用firebase就可以了,而我错过了什么?

  • 问题内容: 我正在我的应用程序上执行以下操作,但是我无法获取routeChangeSuccess事件。 如下所示的非常简单的html也会失败 但是,当我单击链接时,我看到视图正在更新,但是从未触发$ routeChangeSucces事件。 有什么我想念的吗? *我遇到的 *另一个问题 是,可以挂接一个事件以知道视图已准备好,这样我就可以开始一些其他处理,例如document.ready()。 p

  • 从 DAO 中使用 SetOption 方法 DAO 3,6 还提供一个修改缺省设置的新方法。现在,注册表设置可以在执行期间使用 SetOption 方法来修改。要定制 Windows 注册表设置,可从 DAO 中使用 SetOption 方法。使用此选项时,应用程序的灵活性最大,控制性能最佳。使用此法可创建较易维护且能调整到最大执行效率的应用程序。 执行此操作的语法为 dbEngine.SetO

  • 问题内容: Javadoc的方法 doInBackground方法完成后,在事件调度线程上执行。 我已经暗示,对于被取消的工人,情况并非如此。 在每种情况下都会被调用(正常终止或取消),但是当它 未排入 EDT时(通常终止会发生这种情况)。 在取消a的情况下,何时调用有更精确的分析吗? 澄清:这个问题是 不是 就如何一个。在此假定以正确的方式取消。 它是 不是 什么时候他们应该完成的线程仍在工作。