【问题标题】:How to check for data in a child, in a child in Firebase如何在 Firebase 中检查孩子中的数据
【发布时间】:2017-07-24 18:54:15
【问题描述】:

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

我想查看每个频道中是否有用户。这将用于检查是否有频道:

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 的属性的子项,如果有,则执行操作。我想要做的是循环通过所有频道中的儿童(频道)中的儿童(频道中的用户)。我想检查频道中是否有任何孩子,如果没有,请删除该频道。那么如何循环遍历channel children中的children呢?我可以通过调用此函数访问每个频道 ID:

让 id = (channelSnap as!FIRDataSnapshot).key

编辑:

这会打印出 No user in channel:

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

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    如果您为播放器创建密钥,将很容易检查是否有播放器并检索数据。

    捕捉数据会是这样的:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,KeJTqVREbMEmtD0oAk4 是随机用户。这可以工作,但我想以我的方式去做,否则我会得到越来越多的地图。是否可以在频道中搜索名为“userID”的键,因为该频道中的每个用户都应该拥有一个?如果没有用户 ID 的密钥,则没有用户。我想知道这是否可能!
      • 是的..你可以,但问题是userId在一个随机ID内,所以你必须到处搜索它..除非你在某处有对该键的引用..
      • 但是如果你想这样做,你必须在channelSnap.children中添加另一个for..for channelSnap in shapshot.children { for child in channelSnap.children { // look for the userId here } }
      • 感谢您的回答。我忘了包括我可以访问每个频道的唯一 ID。它是: let id = (channelSnap as!FIRDataSnapshot).key 现在是否可以检查每个频道中的孩子?
      • 我更新了我的问题。我试图再次遍历孩子,但它给了我一个 print no user,而该频道中有一个用户。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多