Swift 如何从我的应用程序当前登录用户的文档中检索信息?

Swift 如何从我的应用程序当前登录用户的文档中检索信息?,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,注册/注册用户时,我将数据存储在每个用户文档的3个字段中:名称、电子邮件和用户名。 我有一个按钮,按下它会显示一条欢迎信息,例如:“Hellow,(username)”,但它无法读取当前用户(即当前登录的用户)的用户名,而是显示任何其他随机用户的用户名 我可以使用Firebase Auth阅读当前用户的电子邮件,即: Auth.auth().currentUser?.email 但我无法读取当前用户的用户名,据我所知,该用户名未保存在Firebase的身份验证端 以下是我已经尝试过的代码: f

注册/注册用户时,我将数据存储在每个用户文档的3个字段中:名称、电子邮件和用户名。
我有一个按钮,按下它会显示一条欢迎信息,例如:“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