【问题标题】:Observable do not call onComplete (sqlbrite - mapToOneOrDefault)Observable 不调用 onComplete (sqlbrite - mapToOneOrDefault)
【发布时间】:2019-07-10 12:30:21
【问题描述】:

我已经从 sqlbrite db 中选择,但 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. 工作,但我需要保持秩序,所以我不能使用平面地图

    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...

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

【问题讨论】:

    标签: database rx-java rx-java2 sqlbrite


    【解决方案1】:

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

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

    那么您的concatMap 实现将起作用。

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 2018-10-26
      • 2019-10-02
      • 2018-11-15
      相关资源
      最近更新 更多