房间中 Maybe<List<T>> 的行为不正确?
Posted
技术标签:
【中文标题】房间中 Maybe<List<T>> 的行为不正确?【英文标题】:Incorrect behavior of Maybe<List<T>> in Room? 【发布时间】: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<BoxJob>
,所以switchIfEmpty()
运算符不起作用。
我认为这是不正确的行为。我是对的还是我做错了什么?这个问题有解决办法吗?
【问题讨论】:
【参考方案1】:空列表似乎是一个合适的结果。即使使用空的Maybe
可能会更好,您也可以使用filter()
轻松实现:
boxJobDao.getAll()
.filter !it.isEmpty()
.map boxJobMapper.entityListToTaskList(it)
.switchIfEmpty(syncTasks())
【讨论】:
以上是关于房间中 Maybe<List<T>> 的行为不正确?的主要内容,如果未能解决你的问题,请参考以下文章
Android :RxJava学习笔记之SingleCompletable以及Maybe
房间持久性库 - 带有 List<Video> 的嵌套对象,@Embedded 不起作用。
为啥我在 List<List<T>> 中复制 List<T> 时存在依赖关系? [复制]
List<Map> Productlist = new ArrayList<Map>(); 帮忙举例解释一下这是啥意思。