J'utilise une collection de documents que j'utilise pour identifier les groupes d'utilisateurs. Mon intention est de ne remplir le champ ID du document qu'avec l'ID utilisateur sans avoir d'autres champs inutiles dans les documents. Mais après avoir fait quelques recherches, apparemment, il n'est pas possible d'avoir des documents vides.
Donc, ma question est de savoir comment définir un champ (factice) dans un document sur null, ce qui est supposé être pris en charge par Firestore selon le documentation . Je travaille là-dessus à la fois sur Android et sur le Web, mais je suppose que le code pour n'importe quelle plate-forme est OK.
Mise à jour: j'ai confirmé que le simple fait de mettre null comme champ dans Web fonctionne très bien, cependant, J'essaye l'équivalent sous Android comme ceci:
Map<String, Object> emptyData = new HashMap<>(); emptyData.put("nullField", null);
Android Studio me prévient:
Passer l'argument "null" au paramètre annoté comme @NotNull
Dois-je continuer à passer null ou y a-t-il autre chose que je devrais faire?
3 Réponses :
Les éléments suivants fonctionnent pour le Web:
firebase.firestore().collection('abcd').doc("efgh").set({ name: "...", nullField: null })
Cela fonctionne pour le Web, cependant, lorsque j'essaierai l'équivalent sous Android, cela me préviendra que le champ est annoté avec @NonNull, des idées?
Une solution qui a fonctionné pour moi, aussi simple que cela puisse paraître, consiste à définir le champ que vous souhaitez annuler sur une chaîne vide pour les chaînes et null pour les entiers. Pas de trucs fantaisistes, si vous le souhaitez, vous pouvez le tester en définissant manuellement les valeurs sur null dans votre navigateur de documents Firebase Firestore.
Cela a été fait en utilisant angularfire2, voici le lien vers la documentation: https://github.com/angular/angularfire2/blob/master/docs/firestore/documents.md
Vous pouvez essayer d'ignorer l'avertissement provoqué par l'annotation pour le moment. Je pensais que cela pouvait provenir du type "Object" dans la carte
En supposant que la propriété userId
est de type String, veuillez utiliser le code suivant afin de mettre à jour tous les utilisateurs avec userId = null
:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance(); CollectionReference usersRef = rootRef.collection("users"); usersRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { List<String> list = new ArrayList<>(); for (DocumentSnapshot document : task.getResult()) { list.add(document.getId()); } for (String id : list) { rootRef.collection("Users").document(id).update("userId", null).addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.d(TAG, "Username updated!"); } }); } } } });
Cela fonctionne s'il met à jour le champ, cependant, si j'essaie de définir le document (créer ou mettre à jour), cela me préviendra que le champ censé être nul est annoté avec @NotNull, des idées?
C'est le comportement correct si vous avez ajouté à vos champs cette annotation @NonNull
. Donc, si vous voulez conserver des valeurs null
, vous ne devez pas assurer le compilateur que les champs ne seront pas null
.
mais je n'ai pas annoté le champ comme non nul, veuillez consulter ma mise à jour.
Donc, fondamentalement, je peux simplement supprimer l'avertissement, non?
Essayez-le et voyez le comportement.
C'est une solution de contournement, mais est-il acceptable de le définir sur false à la place?
@Xiiryo Vous pouvez le configurer / le mettre à jour selon vos besoins.