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);, все мои старые данные обновляются и мои новые дети (что я создал во время приложения) потеряны.

enter image description here

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 узел, в котором вы хотите обновить данные.