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.
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.
si vous voulez mettre à jour seulement certains champs, essayez d'utiliser
myRef.child(userID).child("which field do you want to update").setValue(ValueVariable);
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.