2017-03-04 138 views
2

标题可能看起来不正确,但它试图弄清楚如何做到这一点。我的数据结构是这样的:如何检查儿童中的数据,在Firebase中的儿童

data structure

我想看看是否有每个通道呈现用户。这将工作,以检查是否有渠道:

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为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 = ""; 
} 

回答

1

users in channel?

是在KeJTqVREbMEmtD0oAk4通道内用户?如果是这样,我认为这将是很好,有一个密钥users,你会保留所有关于他们的信息...

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

enter image description here

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

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

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

是,KeJTqVREbMEmtD0oAk4是一个随机的用户。这可以工作,但我想以我的方式来做,其他我得到越来越多的地图。是否有可能在频道中搜索名为“userID”的键,因为该频道中的每个用户都应该有一个?如果用户标识没有密钥,则不存在用户。我想听听这是否可能! – Petravd1994

+0

是的..你可以,但问题是'userId'是在一个radom id里面,所以你必须到处搜索它。除非你在某个地方有对该密钥的引用。 –

+0

但是,如果你想这样做,你必须在channelSnap.children中添加另一个'for' .. '''用于shapshot.children中的channelSnap for {0} {0} {0}孩子在channelSnap.children { //在此处查找userId } } ''' –

1

如果你创建了玩家关键将是很容易检查,如果有玩家和检索数据。 Will look like this:

赶数据将是这样的:

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