You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Firebase Realtime Database中获取子节点所属父节点ID的问题

问题核心原因

你当前遍历的是friendlies节点的第一层直接子节点,这层节点的父节点本身就是顶层的friendlies,和你预期的「二级子键对应的父ID」不是同一层级。你需要深入遍历第一层节点下的二级子节点,才能完成子键和上层父ID的匹配。

实现代码

以下是符合Firebase官方API规范的实现,不需要截取字符串:

let targetKey = "GYtQbt3KX1RveVeBAHd08u0Pdm42" // 你要匹配的目标子键
var REF_FRIENDLIES = Database.database().reference().child("friendlies")
// 你原代码的REF.FRIENDLIES是变量名笔误,注意替换为你定义的REF_FRIENDLIES
REF_FRIENDLIES.observeSingleEvent(of: .value, with: { snapshot in
    // 遍历friendlies下的第一层用户ID节点
    for case let userNode as DataSnapshot in snapshot.children {
        let parentUserId = userNode.key // 这个就是你要获取的父节点ID
        // 遍历当前用户节点下的所有好友ID子节点
        for case let friendNode as DataSnapshot in userNode.children {
            if friendNode.key == targetKey {
                print("匹配到目标子键,对应父节点ID:\(parentUserId)")
                // 如果只需要找第一个匹配项,这里可以加break终止遍历
            }
        }
    }
})

如果需要一次性构建所有子键和对应父ID的映射表,方便后续批量查询,可以用以下逻辑:

var friendParentMap = [String: [String]]()
REF_FRIENDLIES.observeSingleEvent(of: .value, with: { snapshot in
    for case let userNode as DataSnapshot in snapshot.children {
        let parentId = userNode.key
        for case let friendNode as DataSnapshot in userNode.children {
            let friendId = friendNode.key
            friendParentMap[friendId, default: []].append(parentId)
        }
    }
    // 后续查询直接取映射表即可
    if let parentIds = friendParentMap["GYtQbt3KX1RveVeBAHd08u0Pdm42"] {
        print("对应父ID列表:\(parentIds)")
    }
})

说明

上述实现完全使用Firebase原生的DataSnapshot遍历API,不需要处理字符串截取,同时兼容同一个好友ID出现在多个用户节点下的场景,符合官方最佳实践。


内容的提问来源于stack exchange,提问作者SQLiteNoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:42:00