我正在使用this库来使用RxJava包装Firebase事务。我是RxJava的新手,所以这主要是关于如何使用它的问题。
场景:Person
和Label
之间存在多对多关系。 Person
可以包含多个Label
个,Label
可以提供给Person
个Person
个。创建Person
时,我必须:
Label
s Persons
,以便查询属于特定标签的所有Label
我有一个List<Label> labels; // Let's assume it's been instantiated and added to
的列表,我想写入我的Firebase数据库。
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference peopleRef = database.getReference().child("people");
DatabaseReference labelsRef = database.getReference().child("labels");
int newPersonId = peopleRef.push().getKey();
我想将这些内容写入数据库:
// Let's assume I already saved the Person to the DB
for (Label label : labels){
// For each label, index the Person saved (Looks like 'personId: true')
labelsRef.child(label).child(newPersonId).setValue(true);
}
如果我不关心通话是否成功,我可以轻松地做到这一点。
Label
但如果我做关心结果怎么办?如果我想对正在更新的所有Activity
做出反应(例如离开当前的Completable
),我需要知道它们是否都已成功更新。
实现RxFirebase,以便在DB中设置值返回n
。我本质上希望将Label
个完整表格压缩在一起,并且只有在成功或失败时才会执行某些操作。
到目前为止,如果我只想更新一个n
,我可以这样做,但我想更新Label
RxFirebaseDatabase.setValue(peopleRef.child(newPersonId), person) // Save the Person
.andThen(RxFirebaseDatabase.setValue(labelsRef.child(label).child(newPersonId), true)) // I can index 1 Label, and this returns a Completable
。
以下代码段链接2个Completables,但只保存1个标签
startDate.getTime()
我该怎么做?如果您对Firebase了解得足够好,这是保存项目列表的正确方法吗?
答案 0 :(得分:1)
如果我正确理解了您的主要问题,那么您有一个Completable
的集合,您需要将它们作为一个订阅。
解决此问题的方法是使用Completable.concat
或Completable.merge
运算符。
可完成。 concat :返回一个Completable,只有当所有来源一个接一个地完成时才会完成。
Completable。 merge :返回一次订阅所有源的Completable实例,仅在所有源Completables完成或其中一个发生错误时完成。
示例:
List<Completable> tasks; // initialized elsewhere
Completable
.concat(tasks)
.subscribe(
() -> Log.d(TAG, "All successful"),
throwable -> Log.w(TAG, "One or more failed"))
关于你的第二个问题,我不太了解Firebase。
更新:要获得List<Completable>
,您可以执行与此类似的操作:
List<Completable> tasks = new ArrayList<>();
for ( ... ) {
tasks.add(RxFirebaseDatabase.setValue(peopleRef.child(newPersonId), person));
}
Completable.concat(tasks).etc