web-dev-qa-db-fra.com

Comment ajouter des valeurs à Firebase Firestore sans écraser?

J'ai deux activités, j'ajoute des données à Firestore à partir de ces deux activités individuellement. Cependant, chaque fois que j'ajoute des données de deuxième activité à Firestore, les données de première activité sont écrasées. J'ai utilisé le code ci-dessous dans les deux activités:

 firebaseFirestore.collection("Users").document(user_id).set(data)

Comment arrêter l'écriture? Je souhaite enregistrer les deux données d'activités dans le même user_id.

6
Thrinadh Reddy

Je vous suggère d'ajouter un document ou une collection supplémentaire pour pouvoir stocker davantage de valeurs de données pour un seul utilisateur.
Vous pouvez créer des références de document pour les deux activités: 

firebaseFirestore.collection("Users").document(user_id+"/acitivity1").set(data);
//and  
firebaseFirestore.collection("Users").document(user_id+"/acitivity2").set(data);

Ou vous pouvez créer une sous-collection pour elle: 

firebaseFirestore.collection("Users").document(user_id)
                  .collection("Activities").document("acitivity1").set(data);
//and
firebaseFirestore.collection("Users").document(user_id)
                  .collection("Activities").document("acitivity2").set(data);

En savoir plus sur les données hiérarchiques .

3
Dumbo

Vous pouvez y parvenir de deux manières. Le premier serait d'utiliser une Map:

Map<String, Object> map = new HashMap<>();
map.put("yourProperty", "yourValue");
firebaseFirestore.collection("Users").document(user_id).update(map);

Comme vous pouvez le constater, j’ai utilisé la méthode update() au lieu de la méthode set().

La deuxième approche consisterait à utiliser un objet de votre classe de modèle comme ceci:

YourModelClass yourModelClass = new YourModelClass();
yourModelClass.setProperty("yourValue");
firebaseFirestore.collection("Users").document(user_id)
    .set(yourModelClass, SetOptions.mergeFields("yourProperty"));

Comme vous pouvez le constater, j’ai utilisé la méthode set() mais j’ai passé comme deuxième argument SetOptions.mergeFields("yourProperty"), ce qui signifie que nous ne faisons une mise à jour que sur un champ spécifique.

5
Alex Mamo

Selon la documentation, vous pouvez utiliser le second paramètre {merge:true}; dans mon expérience, le problème réside généralement dans le fait que vous essayez de stocker des données différentes mais avec la même clé.

Même en utilisant {merge: true}, la clé actuelle sera toujours mise à jour avec la valeur que vous transmettez. 

Merge: true Ne fonctionne que si la clé n'existe pas déjà. Je crois que chaque clé d'un document doit être unique.

Pour le tester, essayez de transmettre (en conservant {merge: true} en tant que second paramètre) des données avec une clé différente, il fusionnera avec l'existant. 

1
fra pet

Si vous savez que le document utilisateur existe déjà dans le magasin, vous devez utiliser

firebaseFirestore.collection("Users").document(user_id).update(data)

Si vous ne savez pas si le document existe, vous pouvez utiliser 

firebaseFirestore.collection("Users").document(user_id).set(data, {merge:true})

Ceci effectue une fusion profonde des données

Sinon, vous pouvez le faire en utilisant des sous-collections 

0
thaffe