如何等到firebase保存所有数据?

时间:2018-03-13 14:08:27

标签: android firebase firebase-realtime-database rx-java2 rx-android

我需要一些有关异步任务和Firebase的帮助。我需要在Firebase实时数据库中保存 n ,但我不知道如何处理回调。

这是我的代码:

 TagRepository tagRepository = new TagRepository();
    for (Tag tag : databaseTags){
        if (user.getTags().containsKey(tag.getId())){
            Completable completable = tagRepository.saveUserOnTag(String.valueOf(tag.getId()), user.getUid());
        }else{
            tagRepository.removeUserOnTag(String.valueOf(tag.getId()), user.getUid());
        }
    }

  public Completable saveUserOnTag(String idTag, String userUid) {
    return io.reactivex.Completable.create(emitter->{
        reference.child(idTag).child("users/").child(userUid).setValue(true).addOnCompleteListener(task -> emitter.onComplete());
    });
}

如果我在此方法上使用回调,回调将被称为 n 次,所以我不知道如何知道所有这些都已经保存,所以我可以继续。

我正在尝试使用Completable,因为你可以在方法上看到,但我真的不知道如何处理它。有什么简单的方法可以同时保存所有数据或控制所有正在保存的数据?

3 个答案:

答案 0 :(得分:2)

根据官方documentation,您可以同时使用更新。

  

使用这些路径,您只需调用updateChildren()即可同时更新JSON树中的多个位置。以这种方式进行的同步更新是原子的:要么所有更新都成功,要么所有更新都失败。

答案 1 :(得分:2)

您可以尝试使用Tasks.await

同步更新firebase数据

按如下所示更改saveUserOnTag方法,然后尝试

public Completable saveUserOnTag (String idTag, String userUid){
        return io.reactivex.Completable.create(emitter -> {
            Tasks.await(reference.child(idTag).child("users/").child(userUid).setValue(true));
            emitter.onComplete();
        });

答案 2 :(得分:1)

抱歉,我不了解Rx,但这是一种在一次API调用中插入所有数据的方法。 onComplete()方法是更新完成回调。

Map<String, Object> values = new HashMap<>();
for (Tag tag : databaseTags){
    if (user.getTags().containsKey(tag.getId())){
        values.put(idTag + "/users/" + userUid, true);
    }else{
        tagRepository.removeUserOnTag(String.valueOf(tag.getId()), user.getUid());
    }
}

reference.updateChildren(values, new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
        // all data saved, do next action
    }
});

希望这会有所帮助:)