2017-10-19 5 views
0

Contexte: Mon application permet actuellement aux utilisateurs de créer un compte, avec un nom d'utilisateur. En cliquant sur confirm - pour créer un compte, une vérification est exécutée sur le nom d'utilisateur pour vérifier qu'il n'existe pas en tant que document dans la collection usernamesi.e cela permet uniquement des noms d'utilisateur uniques au sein de l'application.Vérifier si une collection existe dans Firestore avant de la créer

Les noms d'utilisateurs ont été ajoutés à une carte lorsque la vue a été créé - avant l'utilisateur en appuyant sur le bouton confirm (je comprends que c'est la question sous-jacente)

public static void getAllNonAvailableUsernames() { 
    FirebaseFirestore.getInstance() 
      .collection("usernames") 
      .get().addOnCompleteListener(task -> { 
       List<DocumentSnapshot> snapshots = task.getResult().getDocuments(); 
       for (DocumentSnapshot snap : snapshots) { 
        usedUsernames.put(snap.getId(), snap.get("owner")); 
       } 
      }); 
} 

Un problème se pose lorsque deux utilisateurs choisissent le même nom d'utilisateur pour s'inscrire. La dernière demande est traitée et remplace le champ owner dans le document, les deux permettant aux utilisateurs d'avoir le même nom d'utilisateur:

Format of the usernames collection

Je ne suis pas sûr comment s'y prendre pour résoudre ce problème, étant donné que la récupération des tous les documents de la collection usernames peuvent ne pas se terminer avant la validation.

Répondre

1

Si vous devez avoir des noms d'utilisateur uniques pour vos utilisateurs, la seule façon de le faire correctement est avec un transaction. Au sein de votre transaction, lisez le nom d'utilisateur spécifique que vous essayez d'enregistrer alors:

  • Si le nom d'utilisateur existe: demander à l'utilisateur un autre nom d'utilisateur
  • Sinon, le record utilisateur vers le haut.

La transaction garantit que les deux opérations se produisent de manière atomique.

Notez que les transactions Firestore ne fonctionnent qu'en ligne. Si vous tentez d'exécuter une transaction sans connexion réseau, elle échouera après quelques tentatives. Dans ce cas, vous devrez inviter votre utilisateur à s'enregistrer pendant qu'il a une connexion réseau.

+0

J'ai essayé d'incorporer ceci dans mon application, mais je reçois une erreur 'NOTAUTHENTICATED'. Aussi, en suivant les exemples dans les docs comme référence, je me retrouve avec le document d'utilisateur "apparaissant" comme s'il existait, donc je ne peux pas vérifier si ce n'est pas là. Pouvez-vous donner un exemple. –