android - 如果 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)
}
谢谢你的帮助!
解决方案
flatmap 用于链接可观察对象。它的语法是:
observable1 .flatmap(i-> { return observable2;} )
所以关键是你应该在 flatmap 中返回一个 Observable,并且 Observable 将被向下传播(我的意思是上面代码中的 observable 2)。一种可能的解决方案是让employeeDao.getAll() 返回一个可流动的,或者以某种方式将employeeDao.getAll() 的输出包装在Observable.just() 或Observable.create() 或您知道的任何方法中。
编辑:您必须在平面图中返回一个 observable,您没有使用任何 return 语句。
推荐阅读
- javascript - 我的本地存储无法保存,不知道为什么,第一次使用它
- laravel - Laravel 6 - 在生产模式下有条件地启用调试页面
- javascript - 提交时更改值
- java - 为什么我在 java 中的结果集将我的 dbeaver 列的日期读取为空,我该如何解决这个问题?
- arrays - 发出信号 SIGABRT 的程序:在一个代码中处理中止信号,而在其他代码中不处理
- python - Python3 - [Errno 32] 使用套接字时管道损坏
- php - Laravel jwt auth 令牌签名无法验证
- c++ - std::bind 在 std::array 的 operator[] 上
- php - 使用 PHPUnit 和 Laravel 测试聚合
- java - 从 swagger 向 REST WebServices 发送请求结束到 401 并且未经授权