为什么 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)。但在那种情况下,您无法监听进一步的数据库更改
从 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)。但在那种情况下,您无法监听进一步的数据库更改