Swift中如何用类Like查询获取Firebase实时数据库指定子节点
解决Firebase获取特定前缀子节点的问题
你的当前代码逻辑存在问题:queryStarting(afterValue: userId) 和 queryEnding(beforeValue: userId) 设定的查询范围是空的,自然无法获取任何数据。要获取所有以0yV3uJZAoDWCZNHuRgxrUlKYFgz1为前缀(包括带-1、-2后缀)的子节点,可以按以下方式修改:
方法一:匹配所有前缀一致的节点(推荐)
利用Firebase按键排序的字典序特性,用一个Unicode中排序靠后的特殊字符(比如\u{f8ff})作为结束边界,这样能覆盖所有以目标ID开头的子节点:
let targetPrefix = "0yV3uJZAoDWCZNHuRgxrUlKYFgz1" self.groupRef .child(groupId) .queryOrderedByKey() .queryStarting(atValue: targetPrefix) .queryEnding(atValue: targetPrefix + "\u{f8ff}") .observeSingleEvent(of: .value, with: { snap in // 遍历返回的匹配节点 for child in snap.children { guard let childSnap = child as? DataSnapshot else { continue } let nodeKey = childSnap.key let nodeValue = childSnap.value // 在这里处理每个节点数据 } })
方法二:仅筛选带-1、-2后缀的节点
如果只需要后缀为-1或-2的节点,先获取所有前缀匹配的节点,再在客户端做二次过滤:
let targetPrefix = "0yV3uJZAoDWCZNHuRgxrUlKYFgz1" let allowedSuffixes = ["-1", "-2"] self.groupRef .child(groupId) .queryOrderedByKey() .queryStarting(atValue: targetPrefix) .queryEnding(atValue: targetPrefix + "\u{f8ff}") .observeSingleEvent(of: .value, with: { snap in for child in snap.children { guard let childSnap = child as? DataSnapshot else { continue } let nodeKey = childSnap.key // 校验前缀和后缀是否符合要求 if nodeKey.hasPrefix(targetPrefix) { let suffix = nodeKey.dropFirst(targetPrefix.count) if allowedSuffixes.contains(String(suffix)) { let nodeValue = childSnap.value // 处理符合条件的节点 } } } })
关键说明
- Firebase的按键查询基于字典序排序,
\u{f8ff}是Unicode中排序靠后的字符,能确保所有以目标前缀开头的字符串都落在查询范围内。 - Firebase服务器端查询不支持直接匹配后缀,因此如果需要精准筛选特定后缀,必须在客户端完成二次过滤。
内容的提问来源于stack exchange,提问作者Learn2Code
相关产品推荐
相关产品推荐

