java - Firebase:处理 setValue 失败

标签 java android firebase firebase-realtime-database

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

我的做法是:

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

但是我将如何处理这样的场景:

-- 尝试原地更新 1.假设成功了,然后我尝试原地更新 2.假设也成功了,然后我尝试原地更新 3.假设它更新失败在位置3。此时,我已经更新了位置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
                                                }
                                            }
                                        });
                            }
                        }
                    });
        }
    });

最佳答案

您应该在此 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) {

        }
    });

关于java - Firebase:处理 setValue 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672844/

相关文章:

java - 我的 pom.xml 出现 Maven 错误

java - Android - 写入 ISO15693 标签

android - 如何在 XML android 和 dart Flutter 中结合 java native

android - 如何获得从 SD 卡中删除任何文件的通知

angular - Firebase 云函数以状态码 304 结束

java - 减少圈复杂度问题

java - 将图像数据 InputStream 转换为字符串,然后从该字符串返回图像不会给出图像

android - android 中的警报对话框

firebase - flutter firestore检索不同页面的不同数据

firebase - Flutterfire ios 配置问题