我需要检查数据库是否为空以及是否为空,然后使用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)
}
感谢您的帮助!
答案 0 :(得分:0)
flatmap用于链接可观察对象。它的语法是:
可观察1 .flatmap(i-> { 返回observable2;} )
因此,关键是您应该在平面图中返回一个Observable,并且Observable将向下传播(我的意思是上面的代码中的observable 2)。一种可能的解决方案是使employeeDao.getAll()返回一个可流动的对象,或者某种方式如何将employeeDao.getAll()的输出包装在Observable.just()或Observable.create()或任何已知的方法中。
编辑:您必须在平面图中返回一个可观察的内部,而不使用任何return语句。