如何在RxJava中更改“ RoomDatabase和翻新”

问题描述 投票:1回答:1

我正在使用存储库模式。我想实现一种逻辑,如果内部DB中没有值,则返回Api Response的值并将其插入内部DB中。

接收到的内部DB值(单一类型),如果找到则返回最终值,如果找不到,则请求服务器Api,如果将其插入内部DB(完成类型),则返回最终值(单一类型)如果这些进程中的任何一个调用onError,则此逻辑的最终返回值应为onError。

fun getAllStudent(): Single<List<StudentEntity>> =
        cache.getAllStudent().onErrorResumeNext { getAllStudentRemote() }

private fun getAllStudentRemote(): Single<List<StudentEntity>> =
        remote.getAllMember()
            .map { memberData -> memberData.students }
            .map { studentList -> studentList.map { student -> studentMapper.mapToEntity(student) } }
            .doOnSuccess { studentEntityList -> cache.insertStudents(studentEntityList) }

这就是我尝试过的方法。但是,在插入部分中,由于无法订阅,因此无法插入内部数据库或检测onError。如何实现这种逻辑? ++对不起我的英语不好。

retrofit2 rx-java2 android-room
1个回答
0
投票

由于需要等待cache.insertStudents()完成,因此您可以做的一件事是使用flatMap将cache.insertStudents()链接到流中。

例如:

fun getAllStudent(): Single<List<StudentEntity>> =
        cache.getAllStudent().onErrorResumeNext { getAllStudentRemote() }

private fun getAllStudentRemote(): Single<List<StudentEntity>> =
        remote.getAllMember()
            .map { memberData -> memberData.students }
            .map { studentList -> studentList.map { student -> studentMapper.mapToEntity(student) } }
            .flatMap { studentEntityList -> 
                cache.insertStudents(studentEntityList) // Completable
                    .toSingleDefualt(studentEntityList) // Convert to Single<List<StudentEntity>>
            }

还请注意,.do...运算符是副作用运算符,并且您不应执行任何可能影响流的操作。

© www.soinside.com 2019 - 2024. All rights reserved.