我正在开发一个Android应用程序,每当用户启动此应用程序时,它将生成一个新的注册表(如果不存在),在更新现有数据时,我的应用程序将在用户节点。
每次更新此节点时,所有其他信息都将丢失。
我的用户类
@IgnoreExtraProperties
public class User {
public String userID;
public String userName;
public String userMail;
public boolean active;
public User() {}
public User(String userID, String userName) {
this.userID = userID;
this.userName = userName;
}
public User(String userID, String userName, String userMail, boolean active) {
this.userID = userID;
this.userName = userName;
this.userMail = userMail;
this.active = active;
}
@Exclude
public Map<String, Object> toMap() {
HashMap<String, Object> result = new HashMap<>();
result.put("user_id", userID);
result.put("name", userName);
result.put("email", userMail);
result.put("active", active);
return result;
}
}
我的更新代码:
public class FireBaseUser {
public static String FB_REFERENCE_USER = "user";
public void updateUser(String userID, String userName, String userMail, boolean userActive) {
// Write a message to the database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference(FB_REFERENCE_USER);
User user = new User(userID, userName, userMail, userActive);
Map<String, Object> postValues = user.toMap();
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put(userID, postValues);
myRef.updateChildren(childUpdates);
}
}
当我致电myRef.updateChildren(childUpdates);
时,我的所有旧数据都会更新,而我的新孩子(我在应用中创建的)也会丢失。
答案 0 :(得分:10)
您正在执行更新的引用是路径FB_REFERENCE_USER
- 它似乎是包含用户的路径。
updateChildren
仅更新直接子项,其中的值将被替换。因此,更新正在为用户替换整个子节点,并且不会触及其他用户的子节点。这是预期的行为。
您需要使用针对该特定用户的参考执行更新 - 以便保持未更新的该用户的属性不受影响。
也就是说,你需要做这样的事情:
User user = new User(userID, userName, userMail, userActive);
Map<String, Object> postValues = user.toMap();
myRef.child(userID).updateChildren(postValues);
文档中描述了updateChildren
的行为here。
答案 1 :(得分:9)
如果您只想更新某些字段,请尝试使用
myRef.child(userID).child("which field do you want to update").setValue(ValueVariable);
答案 2 :(得分:1)
是的,您可以在不丢失其他现有数据的情况下更新单个节点。
您需要创建pojo
并在现有节点中设置要更新的值,并将pojo
对象发送到setValue(pojo)
方法。
例如:
User updatedUser=new User();
updatedUser.setName("Rishabh");
updatedUser.SetEmail("rishabh9393@gmail.com");
myref.setValue(updatedUser);
PS:myref
是您要在其中更新数据的user id
节点的引用。
答案 3 :(得分:0)
您可以使用地图执行相同的操作...
String active = "true";
String email = "email@email.com";
String name = "your name";
String user_id = "user_id";
// HashMap For Updating Data
HashMap<String, Object> updateFbDb = new HashMap<>();
updateFbDb.put("active", active);
updateFbDb.put("email", email);
updateFbDb.put("name", name);
updateFbDb.put("user_id", user_id);
fbDbRefRoot.child("user").child(currentUserId).updateChildren(updateFbDb).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// Done
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "fbSetValueFailure: " + e.getMessage());
}
});