如果db使用RxJava2为空,则下载数据

时间:2018-07-27 08:19:42

标签: android kotlin retrofit2 rx-java2 android-room

我需要检查数据库是否为空以及是否为空,然后使用retrofit2下载数据,选择所需的内容并将其插入数据库,最后从数据库返回插入的数据。我已经尝试通过示例https://stackoverflow.com/a/48478847/5184417来做到这一点,但是我无法弄清楚将数据插入数据库的那一部分。它给出了有关返回平面图的错误,该错误将插入数据库不返回任何内容。

我有这段代码

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)
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

  

可观察1             .flatmap(i-> {              返回observable2;}             )

因此,关键是您应该在平面图中返回一个Observable,并且Observable将向下传播(我的意思是上面的代码中的observable 2)。一种可能的解决方案是使employeeDao.getAll()返回一个可流动的对象,或者某种方式如何将employeeDao.getAll()的输出包装在Observable.just()或Observable.create()或任何已知的方法中。

编辑:您必须在平面图中返回一个可观察的内部,而不使用任何return语句。