能读取childByAutoId却无法读取自定义命名节点?技术求助
嘿,我来帮你搞定这个问题~
首先,咱们得搞清楚核心问题:你用Database.database().reference().child("posts")没法读取到"Arts & Humanities"这类子节点,但直接指定具体分类的child就能正常工作,本质上不是路径写错了,而是你处理posts节点快照的方式不对。
为什么直接指定分类能行?
当你写child("Arts & Humanities")时,你直接定位到了具体的子节点,Firebase返回的快照就是这个分类下的所有数据,你可以直接用。但child("posts")是父节点,它包含了所有分类子节点,你需要主动遍历这些子节点才能拿到每个分类的数据,而不是直接取整个快照的值。
正确的处理方式
下面给你两种常用的实现方式:
1. 一次性获取所有分类(用.value监听)
这种方式会一次性拿到posts下的所有子节点数据,然后遍历每个分类:
Database.database().reference().child("posts").observeSingleEvent(of: .value) { snapshot in // 遍历posts下的所有子节点(也就是各个分类) for childSnapshot in snapshot.children { guard let categorySnapshot = childSnapshot as? DataSnapshot else { continue } let categoryName = categorySnapshot.key // 这里就是"Arts & Humanities"、"Science"等分类名称 let categoryPosts = categorySnapshot.value as? [String: Any] // 该分类下的帖子数据 // 在这里处理每个分类的数据,比如打印或者存入数组 print("分类名称:\(categoryName)") print("分类下的帖子:\(categoryPosts ?? [:])") } }
2. 监听分类的新增/变化(用.childAdded监听)
如果需要实时监听posts下新增的分类,或者分类数据的变化,用这种方式更高效:
Database.database().reference().child("posts").observe(.childAdded) { snapshot in let categoryName = snapshot.key let categoryData = snapshot.value // 处理单个分类的数据 print("新增/更新的分类:\(categoryName),数据:\(categoryData ?? "")") }
额外检查点
权限规则:确保Firebase控制台中,
posts节点的读取权限是开放的(或者符合你的业务需求)。比如规则可以写成:{ "rules": { "posts": { ".read": true, ".write": "auth != null" } } }如果
posts节点本身没有读取权限,即使子节点有权限,你也没法通过child("posts")获取数据。数据结构确认:确保你的
posts节点下确实直接包含"Arts & Humanities"、"Science"这些分类子节点,而不是还有更深的层级(比如posts->categories->Arts & Humanities),如果是后者,你需要调整路径到child("posts/categories")。
这样你就不用逐个写具体的分类child了,一次就能获取所有分类节点的数据~
内容的提问来源于stack exchange,提问作者ezera.olsen

