Android Firebase обновить только некоторые поля
Я разрабатываю приложение для 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);
, все мои старые данные обновляются и мои новые дети (что я создал во время приложения) потеряны.
3 ответов
ссылка с которой вы выполняете обновление на путь FB_REFERENCE_USER
- который, по-видимому, является путем, который содержит пользователей.
updateChildren
обновляет только непосредственные дочерние элементы со значениями под заменяемыми. Таким образом, обновление заменяет весь дочерний элемент для пользователя и оставляет детей для других пользователей нетронутыми. Это ожидаемое поведение.
вам нужно выполнить обновление с помощью ссылки для этого конкретного пользователя-так что свойства пользователя, которые не обновляются, остаются нетронутыми.
то есть, вам нужно сделать что-то вроде этого:
User user = new User(userID, userName, userMail, userActive);
Map<String, Object> postValues = user.toMap();
myRef.child(userID).updateChildren(postValues);
поведение updateChildren
описано здесь в документации.
Если вы хотите обновить только некоторые поля, попробуйте использовать
myRef.child(userID).child("which field do you want to update").setValue(ValueVariable);
Да, вы можете обновить один узел без потери существующих данных.
вам нужно создать pojo
и установите значения, которые вы хотите обновить существующий узел и отправить его pojo
объект setValue(pojo)
метод.
например:
User updatedUser=new User();
updatedUser.setName("Rishabh");
updatedUser.SetEmail("rishabh9393@gmail.com");
myref.setValue(updatedUser);
PS:myref
ссылка до user id
узел, в котором вы хотите обновить данные.