可观察的不要调用onComplete(sqlbrite-mapToOneOrDefault)

时间:2019-02-16 16:05:12

标签: database rx-java rx-java2 sqlbrite

我已经从sqlbrite db中进行选择,但是由于某种原因,可以观察到不要调用onComplete。

我的代码:

fun BriteDatabase.selectDayTimelineRecord(dayTimestamp: Long) =
createQuery(table_timeline, selectWDayRecords(dayTimestamp)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
        .mapToOneOrDefault(StatItem(dayTimestamp, 0)) { cursor -> cursor.mapTimelineStat() }

然后我尝试变体:

  1. 正在工作,但是我需要保持秩序,所以我不能使用平面图

    Observable.fromIterable(0..6).flatMap {     db.selectDayTimelineRecords(timestampOfDayInWeek(it)) } .buffer(7).subscribeOn(Schedulers.io())。observeOn(AndroidSchedulers.mainThread())。subscribe {}

  2. 不起作用(无法交付结果,但我不知道为什么)

    Observable.fromIterable(0..6).concatMap {     db.selectDayTimelineRecords(timestampOfDayInWeek(it)) } .buffer(7).subscribeOn(Schedulers.io())。observeOn(AndroidSchedulers.mainThread())。subscribe {}

结果,我希望通过T ...的列表可以观察到

有人知道我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

我对SQLBrite不太熟悉,但是createQuery应该一直在通知数据库更改。如果您只想获得价值,那么可以使用take()运算符。

fun BriteDatabase.selectDayTimelineRecord(dayTimestamp: Long) =
    createQuery(table_timeline, selectWDayRecords(dayTimestamp))
        .mapToOneOrDefault(StatItem(dayTimestamp, 0)) { cursor -> cursor.mapTimelineStat() }
        .take(1)

然后您的concatMap实现将起作用。