如何检查Firebase中孩子的数据

标题可能看起来不对,但是我正在试图弄清楚如何做到这一点。 我的数据结构如下所示:

数据结构

我想看看是否有用户在每个频道提出。 这将工作来检查是否有渠道:

channelRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in for channelSnap in snapshot.children { let channelData = (channelSnap as! FIRDataSnapshot).value as! Dictionary<String, AnyObject> if let name = channelData["name"] as! String!, name.characters.count > 0 { } }) 

这当然会检查是否有一个名为财产的孩子,如果是的话,做东西。 我想要做的是通过所有频道中的孩子(一个频道)中的孩子(频道中的用户)循环。 我想检查频道是否有任何小孩,如果没有,请移除频道。 那么如何循环频道中的孩子呢? 我可以通过调用这个函数来访问每个通道ID:

让id =(channelSnap as!FIRDataSnapshot).key

编辑:

这会打印出通道中没有用户:

 channelRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in for channelSnap in snapshot.children { for child in (channelSnap as AnyObject).children { let usersData = (child as! FIRDataSnapshot).value as? Dictionary<String, AnyObject> if let randomUser = usersData?["userID"] as! String!{ print("user in the channel") } else { print("no user in channel") } } 

编辑2:

这是快照打印,后面是一个channelSnap打印, 而其中有一个用户

 SNAPSHOT: Snap (channels) { "-KePh6YFmQqQ6ZhEfTHn" = { "-KePh6YHPLSAIEARfj-i" = { PictureVersion = 2; readyToGo = 0; userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; username = pietje; }; creator = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; currentPlayers = 1; entryFee = 100; gameType = normal; maximumPlayers = 4; name = "random channel"; password = ""; }; } CHANNELSNAP: Snap (-KePh6YFmQqQ6ZhEfTHn) { "-KePh6YHPLSAIEARfj-i" = { PictureVersion = 2; readyToGo = 0; userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; username = pietje; }; creator = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; currentPlayers = 1; entryFee = 100; gameType = normal; maximumPlayers = 4; name = "random channel"; password = ""; } 

用户在频道?

KeJTqVREbMEmtD0oAk4是频道内的用户吗? 如果是这样,我认为这将是一个关键的users ,你会保留所有关于他们的信息,是很好的… … –

在下面的图片中, example键将对应您的频道。 在里面,你会有other_info ,这将是关于该频道的信息。 然后,有users ,这将保持在渠道中的所有不同的用户。

在这里输入图像说明

然后, channelSnap.child("users").value将拥有该频道中的所有用户。

你可以检查是否有用户的东西:

 if let dict = channelSnap.child("users").value as? [String: Any] { if dict.count == 0 { // no users } else { // you got users } } 

如果您为玩家创build一个密钥将很容易检查是否有玩家和检索数据。 看起来像这样:

要捕捉数据将是这样的:

 ref.child("channels").observeSingleEvent(of: .childAdded, with: { (snapshot) in guard let data = snapshot.value as! [String:AnyObject]? else { return print("Snapshot error!")} if let player = data["players"] { for player in player as! [String:[String:AnyObject]] { print(player.key) print(player.value as Any) } } else { print("No player found!") } })