2017-10-19 1 views
0

Kontext: Meine Anwendung ermöglicht Benutzern derzeit das Erstellen eines Kontos mit einem Benutzernamen. Nach dem Klicken auf confirm - um ein Konto zu erstellen, wird eine Überprüfung auf dem Benutzername ausgeführt, um zu überprüfen, dass es nicht als ein Dokument innerhalb der Sammlung d. H. Dies ermöglicht nur eindeutige Benutzernamen in der Anwendung.Überprüfen, ob eine Sammlung in Firestore vorhanden ist, bevor sie erstellt wird

Die Benutzernamen wurden zu einer Karte hinzugefügt, wenn die Ansicht erstellt wurde - vor dem Benutzer Drücken der confirm Taste (Ich verstehe, dass dies das zugrunde liegende Problem ist)

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")); 
       } 
      }); 
} 

Ein Problem entsteht wenn zwei Benutzer zufällig denselben Benutzernamen für die Registrierung auswählen. Die letzte Anforderung wird verarbeitet und überschreibt die owner Feld innerhalb des Dokuments , so dass beide Benutzer denselben Benutzernamen haben:

Format of the usernames collection

Ich bin nicht sicher, wie über die Lösung dieses Problems zu gehen, da das Abrufen von Alle Dokumente innerhalb der usernames-Sammlung werden möglicherweise nicht beendet, bevor die Überprüfung durchgeführt wird.

Antwort

1

Wenn Sie eindeutige Benutzernamen für Ihre Benutzer benötigen, können Sie dies nur mit einer transaction richtig machen. Innerhalb Ihrer Transaktion, lesen Sie die spezifischen Benutzernamen Sie versuchen dann registrieren:

  • Wenn der Benutzername vorhanden ist: fragen den Benutzer nach einem anderen Benutzernamen
  • Andernfalls den Benutzerdatensatz eingerichtet.

Die Transaktion garantiert, dass beide Operationen atomar ausgeführt werden.

Beachten Sie, dass Firestore-Transaktionen nur online funktionieren. Wenn Sie versuchen, eine Transaktion ohne Netzwerkverbindung auszuführen, wird sie nach einigen Versuchen fehlschlagen. In diesem Fall müssen Sie Ihren Benutzer zur Registrierung auffordern, während er eine Netzwerkverbindung hat.

+0

Ich habe versucht, dies in meine Anwendung zu integrieren, aber ich bekomme einen 'NOTAUTHENTICATED' Fehler. Wenn ich die Beispiele in den Dokumenten als Referenz befolge, sehe ich schließlich, dass das Benutzername-Dokument "erscheint", als ob es existiert, so dass ich nicht prüfen kann, ob es da ist. Können Sie ein Beispiel angeben. –

Verwandte Themen