我試圖查詢Firebase以檢查當前用戶的uid是否列在房間的「參與者」中。如果是這樣,我抓住那個房間的信息。如何檢查firebase子節點的特定值(UID)?
下面是我目前的觀察者,它傾聽應用中的所有房間,而不僅僅是用戶參與的房間。但是我需要首先執行檢查,以查看哪些房間當前用戶的UID被列入;如果有一個匹配(UID是在一個房間裏的人),然後獲取數據,那個房間:
private func observeRooms() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
roomRefHandle = roomRef.observe(.childAdded, with: { (snapshot) -> Void in
let roomData = snapshot.value as! Dictionary<String, AnyObject>
let id = snapshot.key
guard let name = roomData["roomName"] as! String! else {print("Error getting user name"); return}
self.usersRooms.append(Room(id: id, name: name, participants: [uid]))
self.tableView.reloadData()
})
}
這是房間如何在數據庫中的結構化:
"rooms" : {
"-Ki6TJWO-2R1L4SyhSqn" : {
"messages" : {
"-Ki6TWrXxWqjaRJAbyVt" : {
"senderId" : "tzfHgGKWLEPzPU9GvkO4XE1QKy53",
"senderName" : "Timothy",
"text" : "Room One message"
}
},
"participants" : {
"tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true
},
"roomName" : "Room One"
},
"-Ki6TKOnmToeUuBzrnbb" : {
"participants" : {
"tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true
},
"roomName" : "Room Two"
},
"-Ki6TLGC1Encm1v-CbHB" : {
"participants" : {
"tzfHgGKWLEPzPU9GvkO4XE1QKy53" : true
},
"roomName" : "Room Three"
}
}
我怎樣才能改變我的功能,以便它首先檢查所有房間的參與者當前用戶的uid,然後獲取值?
感謝您的任何建議!
編輯:周杰倫的做法:
private func observeRooms() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
let queryRef = roomRef.queryOrdered(byChild: "participants/\(uid)").queryEqual(toValue: true)
queryRef.observe(.childAdded, with: { snapshot in
let roomDict = snapshot.value as! [String: AnyObject]
let id = snapshot.key
let roomName = roomDict["roomName"] as! String
let participants = roomDict["participants"] as! [String: AnyObject]
let numberOfParticipants = participants.count
print("\nRoom Name: \(roomName)")
print("Participants: \(participants)")
print("Room ID: \(id)\n")
self.usersRooms.append(Room(id: id, name: roomName, participants: [uid]))
self.tableView.reloadData()
})
}
無可否認,這是很難測試的,因爲現在我是所有房間的唯一參與者,所有房間都只有我作爲參與者 - 但我的建議工作正常(請參閱我的問題編輯)。我想知道,這是否只會返回我是(當前用戶)參與者的房間?那麼我現在只能從這些房間中獲取數據? – KingTim
在你的例子中,假設你是'user_2' - 這隻會返回'room_0',因爲你不在'room_1'裏? – KingTim
@KingTim你是對的!你的問題是*我試圖查詢Firebase以檢查當前用戶的uid是否列在房間的「參與者」中。如果是這樣,我可以獲取該房間的信息。*我的解決方案完全符合......以及更多!事實上,如果用戶加入額外的房間,它也會通知應用程序;並添加.childChanged和.childRemoved(或.value如果是少量房間),它會通知您任何更改。其他用戶進入房間或離開,房間名稱更改...甚至是新帖! – Jay