J'ai une base de données. La séquence est la suivante: collections - document - hashmaps. Par exemple:
utilisateurs - le nom de la collection
users.uid - le nom du document
Hashmap le document est composé de nombreuses données utilisateur hashmaps Hashmap Hashmap, etc.
Hashmap: le nom de l'utilisateur est la clé et le téléphone, l'emplacement, etc. sont les valeurs. Je n'ai besoin de mettre à jour qu'un seul champ (emplacement) pour un nom d'utilisateur, mais je ne comprends pas comment procéder.
J'ai essayé le moyen suivant (mettre à jour le numéro de téléphone d'Alex):
User user = new User();
user.setPhone(131902331);
Map<String,RealmObject> userMap = new HashMap<>();
userMap.put("alex",user);
mFirebaseFirestore
.collection("users")
.document(mFirebaseAuth.getUid())
.set(userMap, SetOptions.merge())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
LOG.info("Success");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
LOG.error("Failure "+e.toString());
}
});
Qu'est ce que je fais mal?
Lorsque vous appelez set()
sur un document, le contenu existant de ce document est remplacé par les données que vous transmettez.
Si vous souhaitez uniquement mettre à jour les valeurs du champ spécifié dans une carte, utilisez update()
:
mFirebaseFirestore
.collection("users")
.document(mFirebaseAuth.getUid())
.update(userMap)
Voir la documentation Firestore sur mettre à jour un document .
Je sais que la question remonte à presque un an, mais cela pourrait aider quelqu'un. Utilisez notation par points
db.collection("users")
.document("frank")
.update({
"age": 13,
"favorites.color": "Red"
});