Swift 如何从我的应用程序当前登录用户的文档中检索信息?
注册/注册用户时,我将数据存储在每个用户文档的3个字段中:名称、电子邮件和用户名。Swift 如何从我的应用程序当前登录用户的文档中检索信息?,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,注册/注册用户时,我将数据存储在每个用户文档的3个字段中:名称、电子邮件和用户名。 我有一个按钮,按下它会显示一条欢迎信息,例如:“Hellow,(username)”,但它无法读取当前用户(即当前登录的用户)的用户名,而是显示任何其他随机用户的用户名 我可以使用Firebase Auth阅读当前用户的电子邮件,即: Auth.auth().currentUser?.email 但我无法读取当前用户的用户名,据我所知,该用户名未保存在Firebase的身份验证端 以下是我已经尝试过的代码: f
我有一个按钮,按下它会显示一条欢迎信息,例如:“Hellow,(username)”,但它无法读取当前用户(即当前登录的用户)的用户名,而是显示任何其他随机用户的用户名 我可以使用Firebase Auth阅读当前用户的电子邮件,即:
Auth.auth().currentUser?.email
但我无法读取当前用户的用户名,据我所知,该用户名未保存在Firebase的身份验证端
以下是我已经尝试过的代码:
func loadUserData() {
guard let email = Auth.auth().currentUser?.email else { return }
emailString = "\(email)"
self.db.collection("users").getDocuments { (snapshot, error) in
if let err = error {
print("Error: \(err)")
} else {
for document in snapshot!.documents {
let emailRetrieved = document.get("email") as! String
let usernameRetrieved = document.get("username") as! String
print("ATTEN: 658")
self.emailString = emailRetrieved
print(self.emailString)
self.usernameString = usernameRetrieved
print(self.usernameString)
}
}
}
}
这正是文件所建议的。上面的代码只是打印出“users”集合下所有文档的电子邮件和用户名
我的文档名为“users”,每个用户的信息都保存在他们各自的文档中,如果有帮助的话,文档名就是他们的用户ID。如果有人能帮助我,我将不胜感激,我已经在这个问题上纠缠了一段时间。我建议您在文档中创建一个字段,其中包含firebase auth用户的uid或文档id本身。在这里,在
usersEndpoint.js
下查看exports.createUser
...
usersCollection.doc(userRecord.uid).set({
uid: userRecord.uid,
firstname: user.firstname,
lastname: user.lastname,
dateOfBirth: user.dateOfBirth,
sex: user.sex,
city: user.city,
activities: user.activities,
offers: user.offers
})
...
使用这种方法,您可以如下更改代码:
func loadUserData() {
...
let uid= Auth.auth().currentUser?.uid
self.db.collection("users").get(uid) { (snapshot, error) in
if let err = error {
print("Error: \(err)")
} else {
...
}
}
}
...
guard let email = Auth.auth().currentUser?.email else { return }
emailString = "\(email)"
self.db.collection("users").whereField("email", isEqualTo: emailString)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
}
}
}
...
这样,您应该更容易获得用户的正确文档
对不起,我的代码不是swift。我用swift编码已经有一段时间了。但我希望这能有所帮助
编辑
或者,您可以使用类似Firestore中描述的查询。它可能是这样的:
func loadUserData() {
...
let uid= Auth.auth().currentUser?.uid
self.db.collection("users").get(uid) { (snapshot, error) in
if let err = error {
print("Error: \(err)")
} else {
...
}
}
}
...
guard let email = Auth.auth().currentUser?.email else { return }
emailString = "\(email)"
self.db.collection("users").whereField("email", isEqualTo: emailString)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
}
}
}
...
我建议您在文档中使用firebase auth用户的uid或文档id本身创建一个字段。在这里,在
usersEndpoint.js
下查看exports.createUser
...
usersCollection.doc(userRecord.uid).set({
uid: userRecord.uid,
firstname: user.firstname,
lastname: user.lastname,
dateOfBirth: user.dateOfBirth,
sex: user.sex,
city: user.city,
activities: user.activities,
offers: user.offers
})
...
使用这种方法,您可以如下更改代码:
func loadUserData() {
...
let uid= Auth.auth().currentUser?.uid
self.db.collection("users").get(uid) { (snapshot, error) in
if let err = error {
print("Error: \(err)")
} else {
...
}
}
}
...
guard let email = Auth.auth().currentUser?.email else { return }
emailString = "\(email)"
self.db.collection("users").whereField("email", isEqualTo: emailString)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
}
}
}
...
这样,您应该更容易获得用户的正确文档
对不起,我的代码不是swift。我用swift编码已经有一段时间了。但我希望这能有所帮助
编辑
或者,您可以使用类似Firestore中描述的查询。它可能是这样的:
func loadUserData() {
...
let uid= Auth.auth().currentUser?.uid
self.db.collection("users").get(uid) { (snapshot, error) in
if let err = error {
print("Error: \(err)")
} else {
...
}
}
}
...
guard let email = Auth.auth().currentUser?.email else { return }
emailString = "\(email)"
self.db.collection("users").whereField("email", isEqualTo: emailString)
.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
}
}
}
...
如果您可以访问电子邮件和用户名,您还想打印什么?不知何故,我不理解这个问题。我有一个按钮,按下它会显示一条欢迎信息:“你好,(用户名)!”然而,这有时会显示不同用户的用户名,这就产生了一个明显的问题。我想能够获取的用户名只是当前登录的用户!(谢谢你的回答,我将编辑问题以澄清)好的,但你写了“但它只是打印出请求的字段…”。你有所有文件的清单吗?我编辑了这个问题;但是,是的,在“ATTEN:658”下,它会打印所有个人用户文档的电子邮件和用户名,这是我不想要的。相反,我希望它只打印当前登录到应用程序的用户的用户名。问题是,您正在数据库中迭代所有用户。尝试从数据库中只获取一个文档。此外,firestore还统计所有文档读取。所以尽量减少阅读量。如果你可以访问电子邮件和用户名,你还想打印什么?不知何故,我不理解这个问题。我有一个按钮,按下它会显示一条欢迎信息:“你好,(用户名)!”然而,这有时会显示不同用户的用户名,这就产生了一个明显的问题。我想能够获取的用户名只是当前登录的用户!(谢谢你的回答,我将编辑问题以澄清)好的,但你写了“但它只是打印出请求的字段…”。你有所有文件的清单吗?我编辑了这个问题;但是,是的,在“ATTEN:658”下,它会打印所有个人用户文档的电子邮件和用户名,这是我不想要的。相反,我希望它只打印当前登录到应用程序的用户的用户名。问题是,您正在数据库中迭代所有用户。尝试从数据库中只获取一个文档。此外,firestore还统计所有文档读取。所以尽量减少阅读量。非常感谢你的帮助!不幸的是,我以前尝试过你建议的方法,但我也遇到了同样的错误。我希望我能尽快解决它!再次感谢!!您能用以前尝试过的方法提供代码吗?你也使用for循环吗?你的编辑帮我做到了,非常感谢你,伙计。但我能问你一件事吗:正如你所知,在我的应用程序中,按下一个按钮会显示一个警报:“你好(用户名)”。但是,在模拟器中,当我从一个帐户登录到另一个帐户,并按下按钮时,警报将继续读取前一个用户的用户名,直到我在重置前关闭应用程序一次或两次。你对此有什么想法吗?或者你认为我应该为这个问题问一个新问题吗?很高兴这有帮助:)不要垃圾评论部分,因为这是另一个问题,最好问一个新问题,我想:)我理解,我会清理评论,再次感谢!非常感谢你的帮助!不幸的是,我以前尝试过你建议的方法,但我也遇到了同样的错误。我希望我能尽快解决它!再次感谢!!您能用以前尝试过的方法提供代码吗?你也使用for循环吗?你的编辑帮我做到了,非常感谢你,伙计。但我能问你一件事吗:正如你所知,在我的应用程序中,按下一个按钮会显示一个警报:“你好(用户名)”。但是,在模拟器中,当我从一个帐户登录到另一个帐户,然后按t