Android 如何使用太多可完成的方法执行顺序操作
我正试图用Room将服务器上的数据保存到本地数据库。由于这些表相互关联,我希望插入操作按顺序进行。例如,我有学校和季节的表格,这就是我添加数据的方式:Android 如何使用太多可完成的方法执行顺序操作,android,kotlin,rx-java2,android-room,Android,Kotlin,Rx Java2,Android Room,我正试图用Room将服务器上的数据保存到本地数据库。由于这些表相互关联,我希望插入操作按顺序进行。例如,我有学校和季节的表格,这就是我添加数据的方式: fun insertAllSchools(vararg schools: School):Completable=dao.insertAll(*schools) fun insertAllSeasons(vararg seasons: Season):Completable=dao.insertAll(*seasons) 当我为每个表创建一个
fun insertAllSchools(vararg schools: School):Completable=dao.insertAll(*schools)
fun insertAllSeasons(vararg seasons: Season):Completable=dao.insertAll(*seasons)
当我为每个表创建一个单独的方法时,插入过程就完成了,但我必须为每个表编写一个一次性方法。像这样:
fun insertAllSchools(allData:ResponseAll){
if(allData.schoolList!=null){
disposable.add(
repositorySchool.insertAll(*allData.schoolList.toTypedArray())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableCompletableObserver(){
override fun onComplete() {
Log.d(TAG,"OnComplete")
}
override fun onError(e: Throwable) {
Log.e(TAG,"Error"+e.localizedMessage)
}
})
)
}
}
当一个方法完成时,我调用另一个方法,但是这次有很多不必要的代码
我尝试了不同的方法来组合这些可完成的方法并按顺序工作,但它不会添加到数据库中,即使它出现在日志中
例如,我尝试以这种方式组合它:
if(allData.schoolList!=null){
mObservable = Observable.fromArray(
repositorySchool.clearAllData(),
repositorySchool.insertAll(*allData.schoolList.toTypedArray())
)
disposable.add(
mObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableObserver<Completable>() {
override fun onComplete() {
Log.d(TAG,"onComplete")
isDataLoad.value = true
}
override fun onNext(t: Completable) {
Log.d(TAG,"onNext"+t)
}
override fun onError(e: Throwable) {
Log.e(TAG,"onError")
}
})
)
}
有一个名为
doOnComplete()
的方法,您可以使用它通过lambda或jack进行第二次调用 我不同意使用doOnComplete()
。在这种情况下,您不能将这些可完成事件组合成一个您可以观察到的可完成事件。您可能需要的是类似于doThingA()。和(Completable.defer(()->doThingB())
的内容,如在回答类似问题时所述
if(allData.schoolList!=null) {
disposable.add(
repositorySchool.clearAllData()
.andThen(Completable.defer { repositorySchool.insertAll(*allData.schoolList.toTypedArray()) })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableCompletableObserver() {
override fun onComplete() {
isDataLoad.value = true
}
override fun onError(e: Throwable) {
Log.e(TAG,""+e.localizedMessage)
}
})
)
}