【问题标题】:Incorrect behavior of Maybe<List<T>> in Room?房间中 Maybe<List<T>> 的行为不正确?
【发布时间】:2018-05-25 22:35:05
【问题描述】:

我有如下查询方法定义:

@Query("SELECT * FROM box_jobs")
fun getAll(): Maybe<List<BoxJob>>

如果它不为空,我想返回此查询的结果,否则返回 REST API 调用的结果。这是我的这个逻辑代码:

override fun loadTasks(): Maybe<List<Task>> {
    Log.d(TAG, "Searching tasks in database")
    return boxJobDao.getAll()
            .map { boxJobs -> boxJobMapper.entityListToTaskList(boxJobs) }
            .switchIfEmpty(syncTasks())
}

private fun syncTasks(): Maybe<List<Task>> {
    Log.d(TAG, "Loading tasks from server")
    return api.boxJobs(DEVICE_ID)
            .doOnSuccess({ boxJobDtoList ->
                Log.d(TAG, "${boxJobDtoList.size} box jobs loaded from server")
                saveToDb(boxJobDtoList)
            })
            .doOnError({ error -> Log.d(TAG, "Error during tasks loading", error) })
            .map { boxJobDtoList -> boxJobMapper.dtoListToTaskList(boxJobDtoList) }
            .toMaybe()
}

问题是getAll()返回的空数据库Maybe总是调用onSuccess()和空List&lt;BoxJob&gt;,所以switchIfEmpty()运算符不起作用。

我认为这是不正确的行为。我是对的还是我做错了什么?这个问题有解决办法吗?

【问题讨论】:

    标签: android kotlin rx-java2 android-room


    【解决方案1】:

    空列表似乎是一个合适的结果。即使使用空的Maybe 可能会更好,您也可以使用filter() 轻松实现:

    boxJobDao.getAll()
             .filter { !it.isEmpty() }
             .map { boxJobMapper.entityListToTaskList(it) }
             .switchIfEmpty(syncTasks())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多