如何检查一个特定的值(UID)的firebase子节点? [英] How to check a firebase subnode for a specific value (UID)?

查看:297
本文介绍了如何检查一个特定的值(UID)的firebase子节点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图查询Firebase以检查当前用户的uid是否在房间的参与者中列出。如果是这样的话,我抓住那个房间的信息。



下面是我目前的观察者,它倾听应用程序中的所有房间,而不仅仅是用户参与的房间。但是我需要先进行检查,看看当前用户的UID列在哪个房间;如果有一个匹配(uid在一个房间的参与者),然后获取该房间的数据:

pre $私人func observeRooms( ){

guard let uid = FIRAuth.auth()?。currentUser?.uid else {print(Error getting user UID);返回}

roomRefHandle = roomRef.observe(.childAdded,with:{(snapshot) - >无效

让roomData = snapshot.value as!Dictionary< String, AnyObject>
let id = snapshot.key
guard let name = roomData [roomName] as!String!else {print(Error获取用户名); 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
}
},
参与者:{
tzfHgGKWLEPzPU9GvkO4XE1QKy53:true
},
房间名:房间一
},
-Ki6TKOnmToeUuBzrnbb:{
参与者:{
tzfHgGKWLEPzPU9GvkO4XE1QKy53:true
},
roomName:Room Two
},
-Ki6TLGC1Encm1v-CbHB:{
参与者:{
tzfHgGKWLEPzPU9GvkO4XE1QKy53:true
} ,
roomName:Room Three
}
}

我怎样才能改变我的功能,以便它首先检查所有房间的参与者当前用户的uid,然后抓取值?

感谢您的任何建议!编辑:周杰伦的方法:

  private func observeRooms(){

guard let uid = FIRAuth.auth()?currentUser?.uid else {print(Error getting user UID);返回}
let queryRef = roomRef.queryOrdered(byChild:participants / \(uid))。queryEqual(toValue:true)

queryRef.observe(.childAdded,with:{快照在

让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(\ (房间ID:\(id)\\\

打印(参与者:\(参与者))
打印
self.usersRooms.append(Room(id:id,name:roomName,participants:[uid]))
self.tableView.reloadData()
))
}


解决方案

在他们所属的每个房间里。

 房间_0 
房间名称:我的房间
用户
user_1:true
user_2:true
room_1
room_name:房间
用户
user_1:true

然后一个简单的查询将收集所有需要的数据,也将留下一个旁观者,所以如果这个用户加入任何新的房间,应用程序将被通知。

$ pre $ code>让roomsUsersRef = self.ref.child(rooms)
let queryRef = roomsUsersRef.queryOrdered(byChild:users / user_1)。queryEqual(toValue:true)

queryRef.observe (.childAdded,与:{快照

让roomDict = snapshot.value as! [String:AnyObject]
让roomName = roomDict [room_name] as!字符串

让usersDict = roomDict [users] as! (String:AnyObject]
let userCount = usersDict.count
$ b $ print(Room:\(roomName)has \(userCount)users)
})

和输出

 房间:我的房间有2个用户
房间:他们的房间有1个用户

你可以使用.childChanged和.childRemoved来扩展这个事件,以跟踪这个用户所属的房间中发生的任何事件。因此,如果另一个用户加入或离开该用户所在的房间,应用程序将被通知;如果房间的主人从房间里引导这个用户,那么应用程序也会被通知。

I'm trying to query Firebase to check if the current user's uid is listed in a room's "participants". If so, I grab the info for that room.

Below is my current observer which listens to ALL rooms in the app, not just the rooms the user is a participant of. But I need to perform a check first, to see which rooms the current user's UID is listed in; if there's a match (the uid is in a room's participants), THEN get the data for that room:

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()
    })
}

This is how the rooms are structured in the database:

"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"
    }
   }

How can I change my function so that it first checks all the room's participants for the current user's uid, before grabbing the values?

Thanks for any suggestions!

EDIT: Jay's approach:

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()
    })
}

解决方案

To keep it super simple, store a reference to the user in each room they belong to.

rooms
  room_0
   room_name: "My Room"
   users
    user_1: true
    user_2: true
  room_1
   room_name: "Their Room"
   users
    user_1: true

Then a simple query which will gather all the needed data, and will also leave an observer attached so if this user joins any new rooms the app will be notified.

let roomsUsersRef = self.ref.child("rooms")
let queryRef = roomsUsersRef.queryOrdered(byChild: "users/user_1").queryEqual(toValue: true)

queryRef.observe(.childAdded, with: { snapshot in

    let roomDict = snapshot.value as! [String: AnyObject]
    let roomName = roomDict["room_name"] as! String

    let usersDict = roomDict["users"] as! [String: AnyObject]
    let userCount = usersDict.count

    print("Room: \(roomName) has \(userCount) users")
})

and the output

Room: My Room has 2 users
Room: Their Room has 1 users

You could expand on this with .childChanged and .childRemoved to keep track of any events that occur in a room this user belongs to. So if another user joins or leaves a room this user is in, app will be notified; if the owner of the room boots this user from the room, the app will also be notified.

这篇关于如何检查一个特定的值(UID)的firebase子节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆