web-dev-qa-db-fra.com

Android Firebase ne met à jour que certains champs

Je développe une application Android et chaque fois que l'utilisateur lance cette application, elle génère un nouveau registre (s'il n'existe pas) à partir de cet utilisateur, lors de la mise à jour des données existantes, et mon application insère davantage d'informations dans le nœud de l'utilisateur.

Chaque fois que je mets à jour ce nœud, toutes les autres informations sont perdues.

Ma classe d'utilisateurs

@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;
   }

}

Et mon code de mise à jour:

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);

    }
}

Lorsque j'appelle myRef.updateChildren(childUpdates);, toutes mes anciennes données sont mises à jour et mes nouveaux enfants (que j'ai créés lors de l'application) sont perdus.

 enter image description here

10
rodrigo

La référence avec laquelle vous effectuez la mise à jour concerne le chemin FB_REFERENCE_USER - qui semble être le chemin contenant les utilisateurs.

updateChildren met à jour uniquement les enfants immédiats, avec les valeurs sous celles remplacées. Ainsi, la mise à jour remplace l'enfant entier pour l'utilisateur et laisse les enfants pour les autres utilisateurs intacts. C'est le comportement attendu.

Vous devez effectuer la mise à jour en utilisant une référence pour cet utilisateur spécifique - afin que les propriétés de cet utilisateur qui ne sont pas mises à jour ne soient pas modifiées.

C'est-à-dire que vous devez faire quelque chose comme ceci:

User user = new User(userID, userName, userMail, userActive);
Map<String, Object> postValues = user.toMap();
myRef.child(userID).updateChildren(postValues);

Le comportement de updateChildren est décrit ici dans la documentation.

10
cartant

si vous voulez mettre à jour seulement certains champs, essayez d'utiliser 

myRef.child(userID).child("which field do you want to update").setValue(ValueVariable);
8

Oui, vous pouvez mettre à jour le noeud unique sans perte d'autres données existantes.

Vous devez créer un pojo et définir les valeurs que vous souhaitez mettre à jour dans le nœud existant et envoyer cet objet pojo à la méthode setValue(pojo).

Par exemple:

User updatedUser=new User();
updatedUser.setName("Rishabh");
updatedUser.SetEmail("[email protected]");
myref.setValue(updatedUser);

PS: myref est la référence jusqu'au noeud user id dans lequel vous souhaitez mettre à jour les données.

1
rishabh