Firebase中observeSingleEvent搭配queryEqual(toValue)查询无结果问题
Firebase查询用户ID是否在测试列表无结果的排查方案
我来帮你捋捋这个问题,你现在的代码是想检查用户ID是否在Firebase的tempfreeuuid节点下,但没得到预期结果,大概率是这几个地方出了问题:
1. 路径末尾的斜杠可能有隐患
你定义的childString = "tempfreeuuid/"多了个末尾斜杠,虽然Firebase会自动忽略,但有时候会导致路径解析异常,建议改成:
let childString = "tempfreeuuid"
2. 查询方式没必要绕弯,直接检查节点更靠谱
你现在用了queryOrderedByKey().queryEqual(toValue: "FFFFF"),但其实如果只是要验证某个key是否存在,直接访问该节点的效率更高,也不容易出错。试试这个写法:
let targetUUID = "FFFFF" // 直接定位到目标UUID对应的节点 let pointref = ref.child("tempfreeuuid").child(targetUUID) pointref.observeSingleEvent(of: DataEventType.value) { snapshot in if snapshot.exists() { print("that's good") } else { print("用户设备不在测试列表中") } }
这里用snapshot.exists()比hasChildren()更准确——如果目标节点存在但没有子节点,hasChildren()会返回false,但snapshot.exists()依然会正确识别节点存在。
3. 检查Firebase数据库的读取权限
如果你的数据库规则是默认配置,可能会禁止未认证用户读取数据,导致查询返回空结果。可以先临时调整规则测试(上线前一定要改回严格权限):
{ "rules": { "tempfreeuuid": { ".read": true, ".write": false } } }
4. 确认数据结构和查询逻辑匹配
要确保你的Firebase数据结构是这样的:
tempfreeuuid - FFFFF: { ... } // 这里的key就是你要验证的用户ID - XXXXX: { ... }
如果你的数据结构是tempfreeuuid下的节点包含一个uuid字段(比如tempfreeuuid/123/uuid: "FFFFF"),那你的查询写法就错了,需要改成:
let query = pointref.queryOrderedByChild("uuid").queryEqual(toValue: "FFFFF")
最后再试下修正后的查询写法(如果一定要用查询)
如果你坚持要用查询方式,修正路径后的代码应该是这样:
let pointref = ref.child("tempfreeuuid") let query = pointref.queryOrderedByKey().queryEqual(toValue: "FFFFF") query.observeSingleEvent(of: DataEventType.value) { snapshot in if snapshot.exists() { print("that's good") } else { print("不在测试列表中") } }
内容的提问来源于stack exchange,提问作者lithium
相关产品推荐
相关产品推荐

