编辑,在底部更新,仅检索当前用户的子值仍然有问题从火力地堡
我已经存储了我的用户在火力地堡这样的 - 每个用户的值存储它们的UID下(FIRAuth.auth()?.currentUser?.uid
):
"users" : {
"tzfHgGKWLEPzPU9GvkO4XE1QKy53" : {
"gender" : "male",
"handle" : "TestHandle2",
"name" : "Timothy",
"profilePicture" : "https://graph.facebook.com/*removed*/picture?type=large&return_ssl_resources=1"
}
}
我们获得用户的信息(将其设置为我User
对象周围的应用程序中使用),我有这样的功能:
func getUserInfo() {
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users")
// How to get specific user (current user only)??
userRef.observeSingleEvent(of: .value, with: { (snapshot) in
let users = snapshot.value as! [String: Dictionary<String, String>]
for (key, value) in users {
guard let name = value["name"] else {print("Error getting user name"); return}
guard let handle = value["handle"] else {print("Error getting user handle"); return}
guard let gender = value["gender"] else {print("Error getting user gender"); return}
guard let profilePicture = value["profilePicture"] else {print("Error getting user profilePicture"); return}
print("\n\nName: \(name)\nHandle: \(handle)\nGender: \(gender)\nProfile Picture: \(profilePicture)\n\n")
}
})
}
但是,这会返回数据库中所有用户的值 - 我只想获取当前用户的值。
我可以添加/更改此功能以确保它仅检索当前用户的值,而不是所有用户?另外(如果有必要,我可以提出一个单独的问题,但这似乎与此有关),这种将每个用户的值存储为其UID子项的结构是一种很好的方法吗?我注意到其他示例中的很多时间都是以childByAutoId
存储的。我不确定会有什么优势。
感谢您的帮助!
编辑:
如果我添加另一个孩子(UID)的参考结束再投作为[String : AnyObject]
字典,我可以得到当前用户的价值,但解析它似乎是一个问题。
func getUserInfo() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid)
self.currentUser?.uid = uid
userRef.observeSingleEvent(of: .value, with: { (snapshot) in
if let usersDict = snapshot.value as? [String : AnyObject] {
print(usersDict)
for user in usersDict {
// guard let name = user.value(forKey: "name") else {print("Error getting user name"); return}
// guard let handle = user.value(forKey: "handle") else {print("Error getting user handle"); return}
// guard let gender = user.value(forKey: "gender") else {print("Error getting user gender"); return}
// guard let profilePicture = user.value(forKey: "profilePicture") else {print("Error getting user profilePicture"); return}
// print("\n\nName: \(name)\nHandle: \(handle)\nGender: \(gender)\nProfile Picture: \(profilePicture)\n\n")
}
}
})
}
我得到每个user.value(forKey)
线的错误,指出“不能调用非功能型AnyObject的价值。”
如果我在循环内我print(user.value)
我完全返回所有当前用户的值。我无法单独指定它们。
嗯,这是我想要设置用户的价值,包括他们的UID的东西,用这个功能。他们注册了该应用,并将其值存储在Firebase中。然后当他们进入应用程序时,调用这个函数来设置他们的用户对象的信息。 – KingTim
看到您的修改 - 这是所有3个答案推荐的相同方法,并导致崩溃。 – KingTim
你确定用户已经登录,并且你有一个有效的uid值吗?如果孩子的钥匙是空白的,你会得到一个崩溃... – Russell