在我的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
}
}
});
}
}
});
}
});
答案 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) {
}
});