Firebase获取特定用户数据异常:循环遍历子节点而非完整用户
问题分析与解决方案
你的问题核心在于错误地遍历了单个用户节点的子字段,而不是直接从用户节点本身提取数据。当你调用REF_USERS.child(userId)时,返回的快照已经是该用户的完整数据节点,它的children是这个用户的各个字段(如firstName、city等),所以循环遍历这些子节点时,每个user其实是单个字段的快照,自然找不到其他字段的值,导致生成的User对象都是空字段。
修正后的代码
// Get all data about a specific user func getUserdata(userId: String, handler: @escaping (_ userdata: [User]) -> ()) { print("UserId") print(userId) var userArray = [User]() REF_USERS.child(userId).observeSingleEvent(of: .value) { (userdataSnapshot) in // 直接从用户节点快照提取数据,不需要遍历children let firstName = userdataSnapshot.childSnapshot(forPath: "firstName").value as? String ?? "" let lastName = userdataSnapshot.childSnapshot(forPath: "lastName").value as? String ?? "" let name = userdataSnapshot.childSnapshot(forPath: "name").value as? String ?? "" let city = userdataSnapshot.childSnapshot(forPath: "city").value as? String ?? "" let country = userdataSnapshot.childSnapshot(forPath: "country").value as? String ?? "" let profileImageURL = userdataSnapshot.childSnapshot(forPath: "profileImageURL").value as? String ?? "" let defaultHunt = userdataSnapshot.childSnapshot(forPath: "defaultHunt").value as? String ?? "" let user = User(userId: userId, firstName: firstName, lastName: lastName, name: name, city: city, country: country, profileImageURL: profileImageURL, defaultHunt: defaultHunt) userArray.append(user) handler(userArray) } }
为什么原来的代码会出错?
从你的终端输出能看到,userdataSnapshot.children是9个单个字段的快照(比如Snap (city) Oslo),当你循环遍历这些快照时,每个user变量指向的是单个字段节点——比如第一个是city节点,你在它下面找firstName自然找不到,所以返回默认空字符串。
正确的做法是直接使用最外层的userdataSnapshot(也就是该用户的根节点),通过childSnapshot(forPath:)去获取各个字段的值,这样就能拿到正确的数据了。
另外,如果你希望代码更简洁,还可以用Firebase的value转成字典的方式:
if let userDict = userdataSnapshot.value as? [String: Any] { let firstName = userDict["firstName"] as? String ?? "" // 其他字段同理... }
内容的提问来源于stack exchange,提问作者Chris_1983_Norway
相关产品推荐
相关产品推荐

