根据 Firestore/SwiftUI 中集合中的 ID 获取字段数据
get the Field datas according to the Ids from the Collection in the Firestore/SwiftUI
所以,需要解决的问题。我们需要能够根据其ID
获取“用户”-(集合)中任何用户(字段)的数据
这些是我的尝试:
FriendProViewModel() :
@Published var uid: String
@Published var displayName: String
@Published var email: String
init(uid: String, displayName: String, email: String) {
self.uid = uid
self.displayName = displayName
self.email = email
}
并检查结果:
@State var data = [FriendProViewModel]()
let db = Firestore.firestore()
var body: some View {
VStack {
ForEach((self.data), id: \.self.uid) { item in
Text("\(item.displayName)")
Text("\(item.email)")
}
}.onAppear {
// self.fetchData()
self.fetchData2()
}
}
func fetchData() {
// Remove previously data to prevent duplicate data
self.data.removeAll()
self.db.collectionGroup("users").getDocuments() {(querySnapshot, err) in
if let err = err {
print("Error getting documents \(err)")
} else {
for document in querySnapshot!.documents {
let uid = document.documentID
let displayName = document.get("displayName") as! String
let email = document.get("email") as! String
self.data.append(FriendProViewModel(uid: uid, displayName: displayName, email: email))
}
}
}
}
func fetchData2() {
db.collection("users").document("pJSsQQ2qt6Xx9qqRGpVzRfWLgC33").getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("Document data: \(dataDescription)")
} else {
print("Document does not exist")
}
}
}
这是我为 fetchData():
得到的结果
这是我为 fetchData2():
得到的结果
fetchData() 从所有“用户”检索所有数据。 fetchData2() 只是根据我给的 id 获取数据。
分别,我无法根据 id-s...
获取每个的数据
希望大家理解问题。感谢您的关注...
您没有正确设置和使用 FriendProViewModel
。
Read-up 关于如何使用 ObservableObject
.
Re-structure 您的代码使用 ObservableObject
及其组成结构,例如:
// a struct to hold each individual info
struct FriendModel {
var uid: String
var displayName: String
var email: String
}
// an observable, to let the view know when it changes
class FriendProViewModel: ObservableObject {
@Published var friends: [FriendModel] = []
}
在您的视图中这样声明:
@StateObject var viewModel = FriendProViewModel() // instead of `data`
并像这样使用它:
viewModel.friends.append(FriendModel(uid: uid, displayName: displayName, email: email))
和
ForEach(viewModel.friends, id: \.uid) { item in ...}
我还建议您将 fetchData()
等移动到 FriendProViewModel
中
所以,需要解决的问题。我们需要能够根据其ID
获取“用户”-(集合)中任何用户(字段)的数据这些是我的尝试:
FriendProViewModel() :
@Published var uid: String
@Published var displayName: String
@Published var email: String
init(uid: String, displayName: String, email: String) {
self.uid = uid
self.displayName = displayName
self.email = email
}
并检查结果:
@State var data = [FriendProViewModel]()
let db = Firestore.firestore()
var body: some View {
VStack {
ForEach((self.data), id: \.self.uid) { item in
Text("\(item.displayName)")
Text("\(item.email)")
}
}.onAppear {
// self.fetchData()
self.fetchData2()
}
}
func fetchData() {
// Remove previously data to prevent duplicate data
self.data.removeAll()
self.db.collectionGroup("users").getDocuments() {(querySnapshot, err) in
if let err = err {
print("Error getting documents \(err)")
} else {
for document in querySnapshot!.documents {
let uid = document.documentID
let displayName = document.get("displayName") as! String
let email = document.get("email") as! String
self.data.append(FriendProViewModel(uid: uid, displayName: displayName, email: email))
}
}
}
}
func fetchData2() {
db.collection("users").document("pJSsQQ2qt6Xx9qqRGpVzRfWLgC33").getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("Document data: \(dataDescription)")
} else {
print("Document does not exist")
}
}
}
这是我为 fetchData():
得到的结果这是我为 fetchData2():
得到的结果fetchData() 从所有“用户”检索所有数据。 fetchData2() 只是根据我给的 id 获取数据。 分别,我无法根据 id-s...
获取每个的数据希望大家理解问题。感谢您的关注...
您没有正确设置和使用 FriendProViewModel
。
Read-up 关于如何使用 ObservableObject
.
Re-structure 您的代码使用 ObservableObject
及其组成结构,例如:
// a struct to hold each individual info
struct FriendModel {
var uid: String
var displayName: String
var email: String
}
// an observable, to let the view know when it changes
class FriendProViewModel: ObservableObject {
@Published var friends: [FriendModel] = []
}
在您的视图中这样声明:
@StateObject var viewModel = FriendProViewModel() // instead of `data`
并像这样使用它:
viewModel.friends.append(FriendModel(uid: uid, displayName: displayName, email: email))
和
ForEach(viewModel.friends, id: \.uid) { item in ...}
我还建议您将 fetchData()
等移动到 FriendProViewModel