在我的 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/