Maybe<List<T>> 在 Room 中的不正确行为?
Incorrect behavior of Maybe<List<T>> in Room?
我有如下查询方法定义:
@Query("SELECT * FROM box_jobs")
fun getAll(): Maybe<List<BoxJob>>
我想 return 此查询的结果(如果它不为空)或 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()
}
问题是在空数据库 Maybe
return 上 getAll()
总是用空的 List<BoxJob>
调用 onSuccess()
,所以 switchIfEmpty()
运算符不起作用。
我认为这是不正确的行为。我是对的还是我做错了什么?这个问题有解决方法吗?
一个空列表似乎是一个合适的结果。即使空 Maybe
可能更好,您也可以使用 filter()
:
轻松实现
boxJobDao.getAll()
.filter { !it.isEmpty() }
.map { boxJobMapper.entityListToTaskList(it) }
.switchIfEmpty(syncTasks())
我有如下查询方法定义:
@Query("SELECT * FROM box_jobs")
fun getAll(): Maybe<List<BoxJob>>
我想 return 此查询的结果(如果它不为空)或 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()
}
问题是在空数据库 Maybe
return 上 getAll()
总是用空的 List<BoxJob>
调用 onSuccess()
,所以 switchIfEmpty()
运算符不起作用。
我认为这是不正确的行为。我是对的还是我做错了什么?这个问题有解决方法吗?
一个空列表似乎是一个合适的结果。即使空 Maybe
可能更好,您也可以使用 filter()
:
boxJobDao.getAll()
.filter { !it.isEmpty() }
.map { boxJobMapper.entityListToTaskList(it) }
.switchIfEmpty(syncTasks())