2016-12-08 5 views
0

Ich habe eine Tabelle, die alle Benutzer in meiner Firebase-Datenbank abruft. Die tableView-Zelle zeigt einfach den Benutzernamen, die E-Mail-Adresse und das Profilbild an. Das Problem ist, dass ich auch möchte, dass der Benutzer einen Attributschlüssel unter seiner UID im Benutzerknoten hat, der ein Array von Attributen enthält, die er in der App auswählt (die Attribute in diesem Beispiel sind ["food", "drink" "," Sport "]) und ich möchte nur die Benutzer anzeigen, die mindestens drei gleiche Attribute wie der aktuell angemeldete Benutzer haben.Abruf von Benutzerdaten nur, wenn aktuelle Benutzerdaten übereinstimmen

Das erste Problem ist, dass ich nicht wissen, wie man ein Array von Attributen zu meiner Firebase-Datenbank unter meiner UID hinzufügen, wie es als Attribute Knoten mit einer Liste von Index 0 bis Index 2 speichert (3 Schlüssel 0 , 1,2) mit den Saiten "Essen", "Trinken", "Sport". Ich weiß auch nicht, ob dies der beste Weg ist. Jede Hilfe wird geschätzt.

Das zweite Problem ist, dass ich nicht weiß, wie man einen neuen Benutzer holt und es meinem tableView hinzufügt, WENN NUR dieser Benutzer dieselben Attribute wie der gegenwärtige Benutzer hat. Hier ist meine aktuellen Code, dass alle Benutzer, ohne Filterung holt:

func fetchUser() { 
     FIRDatabase.database().reference().child("users").observe(.childAdded, with: { (snapshot) in 

      if let dictionary = snapshot.value as? [String: AnyObject] { 
       let user = User() 

       user.setValuesForKeys(dictionary) 

       self.users.append(user) 



     DispatchQueue.main.async(execute: { 
        self.tableView.reloadData() 
       }) 
      } 

     }, withCancel: nil) 
    } 

class User: NSObject { 

    var name: String? 
    var email: String? 
    var numberId: String? 

    var attributes: String? 

    var password: String? 
    var profileImageUrl: String? 
} 

Antwort

1

Erste. Verwenden Sie keine Arrays. Sie sind extrem situativ und es gibt normalerweise andere, bessere Möglichkeiten, Daten zu speichern.

Antwort auf erste Frage:

eine Firebase Struktur gegeben, in dem Sie die Benutzerdaten und einige Attribute, hier gespeichert werden soll ist eine Struktur, die es tun

users 
    uid_0 
    name: "Frank" 
    attribs 
     fav_food: "Pizza" 
     fav_car: "Camaro" 

und den oben Knoten zu lesen

usersRef.observe(.value, with: { snapshot in 

    for child in (snapshot?.children)! { 
     let snap = child as! FDataSnapshot 
     let dict = snap.value as! [String: AnyObject] 

     let name = dict["name"] //it's Frank 

     let attribs = dict["attribs"] as! [String: AnyObject] 
     let food = attribs["fav_food"] //pizza 
     let car = attribs["fav_car"] //camaro 
    } 
} 

Antwort auf die zweite Frage:

Das zweite Problem ist, dass ich nicht weiß, wie man einen neuen Benutzer holt und es meiner tableView hinzufügt, WENN NUR dieser Benutzer dieselben Attribute wie der aktuelle Benutzer hat. Hier ist meine aktuellen Code, dass alle Benutzer, ohne Filterung holt:

Also, was Sie fragen, ist, wie andere Nutzer zu finden, die die gleichen attribs wie der aktuelle Benutzer haben.

Firebase hat nicht die Fähigkeit, Vergleiche für mehrere Kinder (d. H. Es gibt keine: wo Essen == Pizza und Auto = Camaro).

Eine Möglichkeit ist es, die attribs als String

pizza_Camaro 

dann speichern Sie Strings gleich sind, wenn die attribs sehen leicht überprüfen können.

Eine andere Option ist eine rekursive Abfrage. Hier ist die Idee auf einem 10k Fuß-Ebene

query for all users where fav_food is pizza 
    query from that set of users where fav_car is Camaro 
     query from that set of users where.... 

Sie bekommen die Idee. Es ist nicht super effizient, aber für kleine Datensätze kann es funktionieren.