Observable 不调用 onComplete (sqlbrite - mapToOneOrDefault)

Observable do not call onComplete (sqlbrite - mapToOneOrDefault)

我有 select 来自 sqlbrite 数据库,但由于某种原因,observable 没有调用 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. 工作但我需要保持秩序所以我不能使用 flatmap

    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 列表的 Observable...

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

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

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

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