2017-03-28 2 views
3

Ich habe ein Tutorial über das Erstellen einer Chat-App mit separaten "Räumen" verfolgt, aber es ist nur eine zentrale Liste für jeden Benutzer - ich versuche, sie zu ändern So sieht jeder Benutzer eine Liste seiner eigenen Räume (Räume, die er erstellt und Räume, in denen er von Freunden hinzugefügt wird).Firebase - Einen Verweis auf unter childByAutoID gespeicherte Werte erhalten

Dies ist der Code, der ein Zimmer Griffe erstellen und zur Liste hinzufügen:

// Create new room 
@IBAction func createRoom(_ sender: Any) { 
    if let name = newRoomTextField?.text { 
     let newRoomRef = roomRef.childByAutoId() 
     let roomItem = [ 
      "name": name 
     ] 
     newRoomRef.setValue(roomItem) 

     // How to add room to user's room? 
     let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users") 
    } 
} 

private func observeRooms() { 
    // Observe method to listen for new channels being written to Firebase 
    roomRefHandle = roomRef.observe(.childAdded, with: { (snapshot) -> Void in 
     let roomData = snapshot.value as! Dictionary<String, AnyObject> 
     let id = snapshot.key 
     if let name = roomData["name"] as! String!, name.characters.count > 0 { 
      self.rooms.append(Room(id: id, name: name)) 
      self.tableView.reloadData() 
     } else { 
      print("Error! Could not decode channel data") 
     } 
    }) 
} 

Wenn ein Raum geschaffen wird, ich mag den neu geschaffenen Raum zu dem „Räumen“ Knoten des Benutzers hinzufügen in Firebase (das ich verwenden werde, um die Liste der Benutzer zu erstellen, an denen sie teilnehmen), aber jeder Benutzer hat eine eindeutige ID, die mit childByAutoID erstellt wurde, also weiß ich nicht, wie ich darauf zugreifen soll. Dies ist, was meine Firebase DB-Struktur wie folgt aussieht:

{ 
    "rooms" : { 
    "-KgK418WuJGjYw27Tg1-" : { 
     "messages" : { 
     "-KgK42e1zl3xxUS0E0C0" : { 
      "senderId" : "2q4VCKu1e7hiL84ObdzgQcQ0pH63", 
      "senderName" : "Timothy", 
      "text" : "Hi" 
     }, 
     "-KgK45LTf3R439mOMpvE" : { 
      "senderId" : "2q4VCKu1e7hiL84ObdzgQcQ0pH63", 
      "senderName" : "Timothy", 
      "text" : "Testing" 
     } 
     }, 
     "name" : "Room One" 
    } 
    }, 
    "users" : { 
    "-KgK3zXgap-iRFsbpv8D" : { 
     "gender" : "male", 
     "handle" : "TestHandle123", 
     "name" : "Timothy", 
     "profilePicture" : "https://graph.facebook.com/*removed for privacy*/picture?type=large&return_ssl_resources=1", 
     "rooms" : { 
     "roomName" : "" 
     } 
    } 
    } 
} 

Wie kann ich den Raum für den Benutzer richtig hinzuzufügen, die es in Firebase erstellt?

EDIT:

versuchten dieses

 let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users") 
     let key = userRef.key 
     let childUpdates = ["/\(key)/rooms/": roomItem] 
     userRef.updateChildValues(childUpdates) 

Und es endete einen zweiten Knoten unter "Benutzer" up zu machen, statt innerhalb dieses bestimmten Benutzers.

{ 
    "rooms" : { 
    "-KgKS0VN65GS2r-Cz6K0" : { 
     "name" : "Room Two" 
    } 
    }, 
    "users" : { 
    "-KgKS-X63uSOMnpDWtDn" : { 
     "gender" : "male", 
     "handle" : "TestHandle123", 
     "name" : "Timothy", 
     "profilePicture" : "https://graph.facebook.com/*removed for privacy*/picture?type=large&return_ssl_resources=1" 
     }, 
    "users" : { 
     "rooms" : { 
      "name" : "Room Two" 
      } 
     } 
     } 
    } 

Antwort

4

Sie the documentation lesen sollte, ist hier, wie Sie den Schlüssel speichern können:

let key = ref.child("posts").childByAutoId().key 
+0

Danke, ich die Dokumentation ausgecheckt, obwohl ich mit dem Verständnis es ein wenig bin zu kämpfen. Ich habe versucht, einige Variationen von dem, was ich gelesen habe (siehe meine Bearbeitung) und es einen separaten Knoten unter den Benutzern gemacht, anstatt es zu diesem bestimmten Benutzer hinzufügen (innerhalb der 'ChildByAutoId') – KingTim

+0

@KingTim macht "let key = userRef.key" geben Sie den gleichen Schlüssel wie Ihr Zimmer? –

+0

Eigentlich, wenn ich den Schlüssel drucke, drucke einfach "Benutzer". Ich habe meine Frage bearbeitet, um sie der Firebase DB zu zeigen, als ich diesen Code ausführte – KingTim

Verwandte Themen