房间中 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&lt;BoxJob&gt;,所以switchIfEmpty()运算符不起作用。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于房间中 Maybe<List<T>> 的行为不正确?的主要内容,如果未能解决你的问题,请参考以下文章

Android 房间 DAO 接口不适用于继承

Android :RxJava学习笔记之SingleCompletable以及Maybe

房间持久性库 - 带有 List<Video> 的嵌套对象,@Embedded 不起作用。

为啥我在 List<List<T>> 中复制 List<T> 时存在依赖关系? [复制]

Monad Maybe

List<Map> Productlist = new ArrayList<Map>(); 帮忙举例解释一下这是啥意思。