2017-07-16 4 views
0

Ich möchte meine Benutzerbasis von jedem Benutzernamen Name Wert suchen. Von dem, was ich Online-Menschen gesehen habe oft alle Benutzer dann filtern sie in einer Tabellenansicht, aber das scheint nicht praktikabel noch lebensfähig. Mein Gedanke war, Daten abzufragen und ein exponentiell kleineres Array von Werten zurückzugeben, aber ich habe Probleme mit den bereitgestellten Abfragemethoden.Abfrage Firebase effizient

Wie frage ich einen bestimmten Aspekt meiner Datenbank?

Wie strukturiere ich meinen Code so, dass er lebensfähig ist?; nicht in jedem Benutzer geladen, etwa 10 max gleichzeitig.

Alle Vorschläge, Ressourcen und Links werden sehr geschätzt.

EDIT:

ich einige forsch tat und es sieht aus wie Firebase mit einigen in der Abfrage Methoden gebaut kommt ... So weit das ist, was ich bin versucht, es unten zu drucken mit dem Code zu testen, out Benutzer beginnend mit I, aber ich kann es keine Benutzer in der Konsole

ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}") 
     .observe(.childAdded, with: { snapshot in 
      print(snapshot.key) 
     }) 
+0

1) Ihre Frage ist zu weit. 2) Zeigen Sie Ihre Versuche. 3) alle Ihre Fragen sind einfach zu google. gl –

+0

@VladPulichev Ich habe die Frage ein wenig bearbeitet. Auch wenn Sie mich auf Ressourcen hinweisen könnten, die großartig wären. – Stefan

Antwort

0

es gibt eine Reihe von Lösungen und oft alle Benutzerdaten drucken bekommen Laden zu viele Daten ist.

Hier ist ein typischer Benutzer Knoten

users 
    uid_0 
    name: "Jean Luc" 
    uid_1 
    name: "Will" 
    uid_2 
    name: "Geordi" 

Eine Möglichkeit ist durch die einzelnen Benutzerknoten, einer nach dem anderen zu durchlaufen, um den Benutzernamen abzurufen. Dies vermeidet einen enormen Datensatz vollständig. Wir werden das .childAdded Ereignis verwenden, jeden und Speicher in einem Array zu laden

let usersRef = self.ref.child("users") 
    var userNamesArray = [String]() 

    usersRef.observe(.childAdded, with: { snapshot in 
     let userDict = snapshot.value as! [String: Any] 
     let name = userDict["name"] as! String 
     userNamesArray.append(name) 
    }) 

Eine zweite Möglichkeit, die Benutzername in einem ganz anderen Knoten zu speichern, die deutlich die ‚Unordnung‘, wie der Rest der reduziert Daten bleiben in den Hauptnutzer Knoten

user_names 
    uid_0: "Jean Luc" 
    uid_1: "Will" 
    uid_2: "Geordi" 

Wie Sie mit dieser Struktur sehen können, auch mit Tausenden von Namen nur mit einem sehr kleinen Stellfläche Text es.

Eine weitere Option besteht darin, die X-Anzahl von Benutzern gleichzeitig mithilfe von .startingAt und .endingAt zu laden und die zurückgegebenen Benutzer zu durchlaufen, um die einzelnen Namen abzurufen. In diesem Fall wollen wir alle Benutzer, die mit A beginnen und mit M enden ... Sorry Worf.

let usersRef = self.ref.child("users") 
    var userNamesArray = [String]() 

    let nameQuery = usersRef.queryOrdered(byChild: "name") 
          .queryStarting(atValue: "A") 
          .queryEnding(atValue: "M\u{f8ff}") 
    nameQuery.observe(.value, with: { snapshot in 
     for child in snapshot.children { 
      let snap = child as! DataSnapshot 
      let userDict = snap.value as! [String: Any] 
      let name = userDict["name"] as! String 
      userNamesArray.append(name) 
     } 
    }) 

Das letzte Beispiel begann mit Benutzer-Namen mit A beginnt und endet mit Benutzernamen mit M Endung + eine sehr hohe Unicode-Zeichen, die für alle Namen beginnend mit M es inklusive macht

Die \ Das in der obigen Abfrage verwendete uf8ff-Zeichen ist ein sehr hoher Codepunkt im Unicode-Bereich. Da es nach den meisten regulären Zeichen in Unicode ist, stimmt die Abfrage mit allen Werten überein, die mit queryString beginnen.