SwiftUI:如何在Firestore中读取特定的文档?
SwiftUI:如何在Firestore中读取特定的文档?
我在Firestore中有一个"Users"集合,我想读取其中的一个文档。
我想要读取的文档的文档ID是一个UserUID,所以我的问题是如何读取该文档?
非常感谢帮助。
以下是我目前正在使用的代码:
Button(action: {
guard let userID = Auth.auth().currentUser?.uid else { return }
Firestore.firestore().collection("Users").getDocuments() { (querySnapshot, err) in
if let err = err {
print("获取文档时出错:\(err)")
} else {
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
}
}
}
}) {
Text("从数据库读取数据")
}
问题的出现原因是作者想要在SwiftUI中读取Firestore中特定的文档,并且检查用户密码是否正确。作者通过创建一个名为checkPassword的函数来实现这个功能。
作者在函数中首先创建了Firestore实例db,并且使用用户名作为参数来获取数据库中的特定文档。然后通过调用getDocument方法来获取文档,并使用闭包来处理返回的文档或错误信息。
在闭包中,作者首先检查文档是否存在,如果存在则输出文档的数据。作者使用map方法将文档的数据转换为字符串,并将其打印出来。然后通过使用document.get方法来获取文档中的特定字段的值。作者将获取到的密码字段的值打印出来。
如果文档不存在,则打印出"username does not exist"。
解决方法是使用Firestore的getDocument方法来获取特定文档,并通过使用document.get方法来获取文档中的特定字段的值。通过这种方式,作者可以读取特定文档并检查用户密码是否正确。
下面是整理后的文章:
在SwiftUI中,如何读取Firestore中的特定文档?
我想与大家分享我的解决方案。
我创建了一个名为checkPassword的函数,用于检查用户密码是否正确。
请注意:这是一个版本1的解决方案 - 你不应该像这样实现一个密码检查,因为它对于生产版本来说是不安全的。
func checkPassword(username : String, password : String)
{
let db = Firestore.firestore()
let docRef = db.collection("databaseUser").document("\(username)")
docRef.getDocument{(document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
//Example output: Document data: ["password": test, "username": Test, "email": Test]
print("Document data: \(dataDescription)")
//To understand with what you are working with...
//document.data Output: Optional(["password": test, "username": Test, "email": Test])
print("\(document.data())")
//now you have the fields "password", "username" and "email". You can access every field with...
let fieldVal = document.get("password") as! String
print("Password is: \(fieldVal)")
//same with.. let fieldValTwo = document.get("username") as! String will return the next field.
} else {
print("username does not exist") //username check is before that with a separated function.
}
}
}
以上就是解决这个问题的原因和方法。通过使用Firestore的getDocument方法来获取特定文档,并通过使用document.get方法来获取文档中的特定字段的值,我们可以在SwiftUI中读取Firestore中的特定文档并检查用户密码是否正确。
SwiftUI: 如何从Firestore中读取特定的文档?
在这个问题中,用户想要知道如何从Firestore中读取特定的文档,并将其显示在SwiftUI视图中。以下是解决这个问题的原因和方法。
问题的原因:
用户想要从Firestore中读取特定的文档,但不知道如何进行查询和获取特定字段的值。
解决方法:
以下是解决这个问题的步骤:
1. 使用更具体的查询来获取特定的文档。可以使用`document()`方法,并将文档ID作为参数传递进去。
Firestore.firestore().collection("Users").document(userID).getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("Document data: \(dataDescription)")
let fieldValue = document.get("myFieldName") as? Int
let fieldValueType2 = document.data()["myFieldName"] as? Int
} else {
print("Document does not exist")
}
}
2. 如果希望将获取到的属性存储在变量中以在视图中使用,可以设置一个变量。
struct MyView : View {
var myData: String = ""
// ...
// 在Firebase回调中:
myData = someDataFromTheFirebaseDocument
}
3. 如果在按钮回调中存储网络逻辑(例如与Firebase通信),可能会遇到一些限制和问题。可以考虑使用`ObservableObject`来处理这些调用,并在视图中访问它的属性。
struct MyView {
var firebaseConnector = FirebaseConnector()
var body: some View {
VStack {
Button(action: { firebaseConnect.apiCall() }) {
Text("Press me")
}
Text("Firebase data: \(firebaseConnector.dataToDisplay)")
}
}
}
class FirebaseConnector : ObservableObject {
@Published var dataToDisplay: String
func apiCall() {
guard let userID = Auth.auth().currentUser?.uid else { return }
Firestore.firestore().collection("Users").document(userID).getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
self.dataToDisplay = dataDescription
} else {
print("Document does not exist")
}
}
}
}
通过以上步骤,用户可以从Firestore中读取特定的文档,并将其显示在SwiftUI视图中。