我正在开发一个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 MaptoMap() { HashMap 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); MappostValues = user.toMap(); Map childUpdates = new HashMap<>(); childUpdates.put(userID, postValues); myRef.updateChildren(childUpdates); } }
当我打电话时myRef.updateChildren(childUpdates);
,所有旧数据都会更新,我的新孩子(我在应用程序中创建的)会丢失.
您正在执行更新的引用是针对路径FB_REFERENCE_USER
- 它似乎是包含用户的路径.
updateChildren
仅更新直接子项,其中的值将被替换.因此,更新正在为用户替换整个子节点,并且不会触及其他用户的子节点.这是预期的行为.
您需要使用针对该特定用户的ref执行更新 - 以便保持未更新的该用户的属性不受影响.
也就是说,你需要做这样的事情:
User user = new User(userID, userName, userMail, userActive);
Map postValues = user.toMap();
myRef.child(userID).updateChildren(postValues);
的行为updateChildren
被描述这里的文档.
如果您只想更新某些字段,请尝试使用
myRef.child(userID).child("which field do you want to update").setValue(ValueVariable);