Firebase Swift 如何读取childByAutoId生成节点下的全部存储数据
问题排查与修复方案
核心问题1:列表刷新时机错误
Firebase Realtime Database的数据读取是异步操作,你当前把self.favList.reloadData()写在observe回调的外部,会出现数据还没从服务端拉取完成、数组还没赋值就先刷新了列表的情况,自然看不到数据。你需要把刷新操作放到回调的最后,等数组赋值完成后再执行。
核心问题2:强制解包风险
你代码中多处使用!强制解包可选值,一旦对应节点不存在itemName字段、或者节点结构异常,会直接触发崩溃,需要替换为安全的可选绑定写法。
修复后代码
func retrieveItems() { guard let userId = Auth.auth().currentUser?.uid else { return } let ref = Database.database().reference().child("users/\(userId)/Favourited") ref.observe(.value, with: { [weak self] (snapshot) in guard let self = self else { return } self.favUsers.removeAll() guard snapshot.childrenCount > 0 else { print("not yet") // 没有数据也要刷新列表清空旧展示 self.favList.reloadData() return } for likes in snapshot.children.allObjects as! [DataSnapshot] { // 安全解包节点数据和字段 guard let likesObject = likes.value as? [String: Any], let itemName = likesObject["itemName"] as? String else { continue } let likesList = Names(id: likes.key, itemName: itemName) self.favUsers.append(likesList) } // 所有数据遍历完成后再刷新列表 self.favList.reloadData() }) { error in // 可选添加错误监听,排查权限/路径错误 print("数据读取失败:\(error.localizedDescription)") } }
额外排查点
如果修改后还是拿不到数据,可以按以下顺序排查:
- 确认数据库路径是否正确,你当前路径是
users/用户ID/Favourited,需要和你数据库的根节点结构完全匹配,注意大小写拼写 - 确认数据库的读写权限配置,是否允许已登录用户读取自己的收藏节点
- 确认当前登录的用户ID和数据库中存储的用户ID一致
内容的提问来源于stack exchange,提问作者noobcoderSwift
相关产品推荐
相关产品推荐

