Room <List <T >>的行为不正确?

Fyo*_*tov 3 android kotlin rx-java2 android-room

我有以下查询方法定义:

@Query("SELECT * FROM box_jobs")
fun getAll(): Maybe<List<BoxJob>>
Run Code Online (Sandbox Code Playgroud)

我想返回此查询的结果,如果它不为空,否则返回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()
}
Run Code Online (Sandbox Code Playgroud)

问题是,总是使用空调用Maybe返回空数据库,因此运算符不起作用.getAll()onSuccess()List<BoxJob>switchIfEmpty()

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

tyn*_*ynn 5

空列表似乎是一个合适的结果.即使最好换一个空Maybe,也可以使用以下方法轻松实现filter():

boxJobDao.getAll()
         .filter { !it.isEmpty() }
         .map { boxJobMapper.entityListToTaskList(it) }
         .switchIfEmpty(syncTasks())
Run Code Online (Sandbox Code Playgroud)