2017-03-15 1 views
3

Ich bin relativ neu in Swift und Firebase und ich suche nach einer Möglichkeit, die Firebase-Datenbank abzufragen, um einen bestimmten Wert zu finden. Im Zusammenhang mit der App, die ich entwickle, muss sich ein Benutzer bei der Anmeldung einen Benutzernamen wählen, und wir möchten in der Datenbank überprüfen, dass kein anderer Nutzer bereits den gewählten Nutzernamen hat. Meine Datenbank-Struktur sieht wie so:Firebase-Abfrage (in Swift), um einen bestimmten Wert innerhalb aller Benutzer einer App zu finden

Image of DB structure

Lasst uns sagen, dass ich in der App bin Registrierung und ich würde meinen Benutzernamen wie „Mike“ zu sein. Ich mag, dass der App in allen „username“ Feldern in der Datenbank zu suchen, um zu überprüfen, ob „mike“ ist bereits vergeben, aber mein Code Firebase funktioniert nicht:

let queryRef = FIRDatabase.database().reference().child("users") 
    queryRef.queryOrdered(byChild: "username") 
     .queryEqual(toValue: self.username.text) 
     .observeSingleEvent(of: .value, with: { snapshot in 
      if snapshot.exists() 
      { 
       print(snapshot) 
      } 
     }) 

Alles nach „Schnappschuss“ doesn‘ t sogar ausgeführt (springt über den Befehlssatz). Momentan teste ich gerade, bevor ich die eigentliche Prüfung durchführe, den "Schnappschuss" -Wert zu drucken, aber er wird nie gedruckt.

ich meine DB Regeln so, da die „username“ Schlüssel muss für jedermann zugänglich sein versucht, es zu fragen:

{ 
    "rules": { 
    "users": { 
     "$uid": { 

     "email": { 
      ".read": "$uid === auth.uid", 
      ".write": "$uid === auth.uid", 
     }, 
     "username": { 
      ".read": true, 
      ".write": "$uid === auth.uid", 
     } 

     } 
    }  
    } 
} 

Es ist wichtig, hier für mich alles privat zu halten, außer für den „username " Schlüssel. In diesem Beispiel habe ich nur die "E-Mail" und "Benutzername" -Tasten zur Vereinfachung, aber in meiner eigentlichen App habe ich viel mehr (Vorname, Nachname, Geburtsdatum, Telefonnummer, etc.)

Any Hilfe an diesem Punkt wird geschätzt. Vielen Dank

Antwort

1

Ich glaube nicht, dass das möglich ist.

Von der Firebase Dokumentation:

Regeln werden in einer atomaren Weise angewendet. Dies bedeutet, dass eine Lese- oder Schreiboperation sofort fehlschlägt, wenn keine Regel an dieser Position oder an einer übergeordneten Stelle vorhanden ist, die Zugriff gewährt. Selbst wenn auf jeden betroffenen untergeordneten Pfad zugegriffen werden kann, wird das Lesen am übergeordneten Speicherort vollständig fehlschlagen.

In Ihrem Fall, wie Sie durch die username zu filtern versuchen, aber es ist nicht für den übergeordneten Knoten Regel users Sie nicht in der Lage sein, um die Filterung zu vervollständigen, wie es für PERMISSION_DENIED fehl.

Sie könnten aber Zugriff users/a_valid_uid/username wie der gesamte Pfad ist zugänglich.

Etwas, was Sie als Workaround tun könnten, ist ein separater Knoten, der nur die Benutzernamen enthält und diese der Öffentlichkeit zum Lesen zur Verfügung stellt.

Sie können die vollständige Dokumentation über Firebase-Regeln here einsehen.

Hinweis: Sie können den Simulator der Firebase-Regeln verwenden, um Ihre Regeln zu testen, bevor Sie sie bereitstellen.

Verwandte Themen