我正在开发一个 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);
时,我所有的旧数据都会更新,而我的新子数据(我在应用程序期间创建的数据)会丢失。
最佳答案
您执行更新所用的引用是针对路径 FB_REFERENCE_USER
- 这似乎是包含用户的路径。
updateChildren
仅更新直接子项,并替换这些子项下的值。所以更新正在为用户替换整个 child ,并让其他用户的 child 保持不变。这是预期的行为。
您需要使用该特定用户的 ref 执行更新 - 以便该用户未更新的属性保持不变。
也就是说,你需要做这样的事情:
User user = new User(userID, userName, userMail, userActive);
Map<String, Object> postValues = user.toMap();
myRef.child(userID).updateChildren(postValues);
描述了 updateChildren
的行为 here在文档中。
关于Android Firebase 只更新部分字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41688271/