Firebase:处理setValue失败

时间:2018-04-05 12:49:19

标签: java android firebase firebase-realtime-database

在我的Android应用中,我使用Firebase存储一些用户信息。 我将用户的username存储在3个不同的地方。 我在我的应用中有这个选项,我允许用户更新他们的username。我想知道在所有这3个地方更新username的最可靠方法。

我的方法是这样做:

- 更新到位1.如果成功,则更新到位2.如果成功,则更新到位3.如果成功,那么我一切都很好。 username已在所有3个地方成功更新。

但我如何处理这样的情景:

- 尝试更新到位1.让我们说这是成功的,然后我尝试更新到位2.让我们说这也是成功的,然后我尝试更新到位3.让我们说它无法更新到位3.此时,我已将username更新到位1并放置2,但未到位3.

当Firebase尝试更新时,如果用户的手机与Wifi断开连接,则会出现这种情况。如果发生这种情况,我想以适当的方式处理它。下面是一些关于我如何做的参考代码:

placeOneReference.child(key).setValue(newUsername)
    .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            placeTwoReference.child(key).setValue(newUsername)
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                placeThreeReference.child(key).setValue(newUsername)
                                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {
                                                    // Everything is successful
                                                }
                                            }
                                        });
                            }
                        }
                    });
        }
    });

1 个答案:

答案 0 :(得分:1)

您应该在此case中使用多路径更新。这样你就不会级联请求,而是让firebase在一个“原子”更新函数中处理它们。

    Map<String, Object> value = new HashMap<>();
    value.put("username", username);

    Map<String, Object> childUpdates = new HashMap<>();
    childUpdates.put("/path1/" + key, value);
    childUpdates.put("/path2/" + key, value);
    childUpdates.put("/path3/" + key, value);



    mDatabase.updateChildren(childUpdates);

如果您想要在完成后通知或者发生其他任何事情(错误),您甚至可以添加onComplete监听器来更新子项。

mDatabase.updateChildren(childUpdates, new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {

        }
    });