如何在Firebase中的孩子中检查孩子的数据

时间:2017-03-04 18:20:40

标签: ios swift firebase firebase-realtime-database

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

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

这当然会检查是否有一个名为name的属性的孩子,如果有的话,做一些事情。我想要做的是在所有频道中循环播放孩子(频道中的用户)的孩子(频道)。我想检查频道中是否有孩子,如果没有,请删除该频道。那么如何在孩子们的频道中循环?我可以通过调用此函数来访问每个通道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 = "";
}

2 个答案:

答案 0 :(得分: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
   }
}

答案 1 :(得分:1)

如果为玩家创建一个按键,将很容易检查是否有玩家并检索数据。 Will look like this:

要捕获数据将是这样的:

a2b:   e8 1a 01 00 00          call   b4a <_ZN4Base4setxEi> ; A call to setx()
a30:   48 8d 45 e0             lea    rax,[rbp-0x20]
a34:   be 04 00 00 00          mov    esi,0x4
a39:   48 89 c7                mov    rdi,rax
a3c:   e8 33 01 00 00          call   b74 <_ZN4Base4setyEi> ; A call to sety()
a41:   48 8d 45 e0             lea    rax,[rbp-0x20]
a45:   48 89 c7                mov    rdi,rax
a48:   e8 15 01 00 00          call   b62 <_ZNK4Base4getyEv> ; A call to gety()
a4d:   89 c3                   mov    ebx,eax
a4f:   48 8d 45 e0             lea    rax,[rbp-0x20]
a53:   48 89 c7                mov    rdi,rax
a56:   e8 df 00 00 00          call   b3a <_ZNK4Base4getxEv> ; A call to getx()