我正在使用Firebase Firestore(远程数据库)和Room(Sqlite,本地数据库)开发Android应用。
在此应用中,第一次从Firebase服务器获取数据并将其插入本地数据库。
有多个表,所以我应该为每个表多次调用它。
例如,
这是firebase函数:
class MonsterDataSource(val mMonsterDao: MonsterDao) {
private val TAG = MonsterDataSource::class.java.simpleName
fun sync(): Single<Boolean> {
return Single.create<Boolean> { emitter ->
FirebaseFirestore.getInstance().collection(MONSTERS)
.get()
.addOnCompleteListener {
if (it.isSuccessful) {
// Get data from the firebase
val monsters = mutableListOf<Monster>()
it.result.documents.forEach {
monsters.add(it.toObject(Monster::class.java)!!)
}
// insert data into the local database
Observable.fromCallable {
mMonsterDao.save(*monsters.toTypedArray()) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
Log.d(TAG, "[MHW][Monster] save done")
emitter.onSuccess(true)
}
} else {
emitter.onError(FirestoreGetFailureException())
}
}
}
}
}
我不知道如何将这些单曲组合成一个。
fun syncData() {
val monsterSingle = MonsterDataSource().sync()
val itemSingle = ItemDataSource().sync()
val skillSingle = SkillDataSource().sync()
val weaponSingle = WeaponDataSource().sync()
...
// I want to know when all data are stored in the local database.
}
第一次,该应用程序被锁定以从服务器获取数据。 完成所有数据同步后(从firebase获取,插入本地数据库),我想解锁该应用程序。 但是我不知道如何组合多个Singles并获得“ onComplete”方法。
或
如果您有其他解决方案,对我会有所帮助。
答案 0 :(得分:0)
您可以flatMap每个对象。
例如
new MonsterDataSource().sync()
.flatMap(monsterSingleResult -> ItemDataSource().sync())
.flatMap(itemSingleResult -> SkillDataSource().sync())
// more flatMaps
.subscribe(finalResult -> {
// done with all the jobs
});
另一种选择是将它们zip
一起
Single.zip(monsterSingle,itemSingle,...,(monsterResult,itemResult,...) -> {
// final result
})
除非您使用Scheduler
,否则它们将被顺序执行。