在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
相关产品推荐
相关产品推荐

