首页 > 解决方案 > 如果 db 为空,则使用 RxJava2 下载数据

问题描述

我需要检查数据库是否为空,如果是,则使用retrofit2下载数据,选择我需要的并将其插入数据库,最后从数据库返回插入的数据。我曾尝试使用此示例https://stackoverflow.com/a/48478847/5184417来完成此操作,但我无法弄清楚将数据插入数据库的部分。它给出了一个关于返回 flatmap 的错误,即插入数据库不返回任何内容。

我有这段代码

fun getEmployees(): Flowable<List<Employee>> {
    return employeeDao.getEmployeeCount()
            .take(1)
            .flatMap { counts ->
                if (counts.isEmpty() || counts[0] == 0) {
                    Api.getAPIService().getDepartments()
                            .flatMap{ response ->
                                employeeDao.deleteAll()
                                for (departments in response.Departments) {
                                    if (departments.Name == "AR") {
                                        for (employee in departments.employees) {
                                            employeeDao.insert(employee)
                                        }
                                    }
                                }

                                state.postValue(RepositoryState.READY)
                            }
                            .ignoreElements()
                            .andThen(employeeDao.getAll())
                }
                employeeDao.getAll()
            }
}

interface ApiService {
    @GET("departments")
    fun getDepartments() : Single<Departments>
}

@Dao
interface EmployeeDao {
    @Query("SELECT * FROM employees")
    fun getAll(): Flowable<List<Employee>>

    @Query("SELECT count(1) FROM employees")
    fun getEmployeeCount(): Flowable<List<Int>>

    @Insert(onConflict = REPLACE)
    fun insert(employee: Employee)
}

谢谢你的帮助!

标签: androidkotlinretrofit2rx-java2android-room

解决方案


flatmap 用于链接可观察对象。它的语法是:

observable1 .flatmap(i-> { return observable2;} )

所以关键是你应该在 flatmap 中返回一个 Observable,并且 Observable 将被向下传播(我的意思是上面代码中的 observable 2)。一种可能的解决方案是让employeeDao.getAll() 返回一个可流动的,或者以某种方式将employeeDao.getAll() 的输出包装在Observable.just() 或Observable.create() 或您知道的任何方法中。

编辑:您必须在平面图中返回一个 observable,您没有使用任何 return 语句。


推荐阅读