为什么 Room DAO 的 Flowable<List> 方法永远无法完成?

why method with Flowable<List> of Room DAO never completes?

从 DB 获取数据,Room DAO 有一个方法 returns 一个 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)));

 }

我已经测试过,即使我只用 userDao.allUserDatas() 替换 userDatas()(我确定它存在于数据库中),它也会给出相同的结果

理想情况下,您应该修复 userDao 以使其正常完成。如果由于某种原因无法做到这一点,您可以将其超时并将错误映射为空,强制完成,如下所示:

userDao.getInfo(userData.getId())
   .timeout(1, TimeUnit.SECOND)
   .onErrorResumeNext(Observable.empty())

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

如果您需要调用完整的方法,您可以使用 take(1)。但在那种情况下,您无法监听进一步的数据库更改