如何使用SwiftUI更新Firebase中的集合?
我正在SwiftUI上开发一个患者/库存管理软件,我决定放弃CoreData,转而使用Firebase。这似乎不那么麻烦,但对我这个初学者来说,这仍然是一个学习曲线。一个开发人员最初帮助我在API patient文件中创建和获取患者,但现在我正在尝试更新数据,我似乎不知道该写什么 我阅读了多个教程,它们似乎都在使用db.collection的方法来做事情 这是我的密码如何使用SwiftUI更新Firebase中的集合?,swift,firebase,google-cloud-firestore,swiftui,foundation,Swift,Firebase,Google Cloud Firestore,Swiftui,Foundation,我正在SwiftUI上开发一个患者/库存管理软件,我决定放弃CoreData,转而使用Firebase。这似乎不那么麻烦,但对我这个初学者来说,这仍然是一个学习曲线。一个开发人员最初帮助我在API patient文件中创建和获取患者,但现在我正在尝试更新数据,我似乎不知道该写什么 我阅读了多个教程,它们似乎都在使用db.collection的方法来做事情 这是我的密码 import Foundation import FirebaseFirestore class PatientAPI {
import Foundation
import FirebaseFirestore
class PatientAPI {
func createPatient(firstName: String, lastName: String, address: String, postCode: String, phoneNumber: String, onSuccess: @escaping(_ successMessage: String) -> Void) {
let testPatient = PatientModel.init(firstName: firstName, lastName: lastName, address: address, postalCode: postCode, phoneNumber: phoneNumber)
guard let dict = try? testPatient.toDictionary() else {return} /
API.FIRESTORE_COLLECTION_PATIENTS.addDocument(data: dict)
onSuccess("Done")
}
func getPatients(onSuccess: @escaping(_ patients: [PatientModel]) -> Void, onError: @escaping(_ errorMesage: String) -> Void) {
API.FIRESTORE_COLLECTION_PATIENTS.getDocuments { (snapshot, error) in
if let error = error {
onError(error.localizedDescription)
return
}
guard let snap = snapshot else {return}
var patients = [PatientModel]()
for document in snap.documents {
let dict = document.data()
guard let decodedPatient = try? PatientModel.init(fromDictionary: dict) else {return}
patients.append(decodedPatient)
}
onSuccess(patients)
}
}
}
非常感谢我建议使用Firebase的可编码支持,因为这将使您的代码更具可读性和可维护性 为此,您的
患者
应该是符合可编码
的结构
,如下所示:
struct患者:可识别、可编码{
@DocumentID变量id:String?
var firstName:String
var lastName:String
变量地址:字符串
// ...
}
然后,要从集合中提取所有患者(或满足某些条件的患者),请使用Firestore的快照侦听器:
func fetchData(){
db.collection(“patients”).addSnapshotListener{(querySnapshot,error)位于
guard let documents=querySnapshot?.其他文档{
打印(“无文件”)
返回
}
self.books=documents.compactMap{queryDocumentSnapshot->Patient?in
返回try?queryDocumentSnapshot.data(as:Patient.self)
}
}
}
要添加新患者,请首先创建新患者:
let patient=patient(名字:“Jane”,姓氏:“Appleseed”,/*其他属性在此处*/)
然后将其添加到集合中,如下所示:
func添加患者(患者:患者){
做{
让我们试试db.collection(“patients”).addDocument(from:patient)
}
抓住{
打印(错误)
}
}
有关这方面的更多详细信息,请参阅我的。我建议使用Firebase的可编码支持,因为这将使您的代码更具可读性和可维护性 为此,您的
患者
应该是符合可编码
的结构
,如下所示:
struct患者:可识别、可编码{
@DocumentID变量id:String?
var firstName:String
var lastName:String
变量地址:字符串
// ...
}
然后,要从集合中提取所有患者(或满足某些条件的患者),请使用Firestore的快照侦听器:
func fetchData(){
db.collection(“patients”).addSnapshotListener{(querySnapshot,error)位于
guard let documents=querySnapshot?.其他文档{
打印(“无文件”)
返回
}
self.books=documents.compactMap{queryDocumentSnapshot->Patient?in
返回try?queryDocumentSnapshot.data(as:Patient.self)
}
}
}
要添加新患者,请首先创建新患者:
let patient=patient(名字:“Jane”,姓氏:“Appleseed”,/*其他属性在此处*/)
然后将其添加到集合中,如下所示:
func添加患者(患者:患者){
做{
让我们试试db.collection(“patients”).addDocument(from:patient)
}
抓住{
打印(错误)
}
}
有关这方面的更多详细信息,请参见我的。我一直在关注您的教程,如果我明白了这一点,我有一个API文件,根据您的建议,它应该是PatientPository和func addPatient,我可以将其放入PatientViewModel中,并附带所有必要的函数(删除、更新等)。因此,存储库是将所有与数据访问相关的代码封装在一个位置的好方法。在视图模型中,然后使用存储库的方法以视图需要的方式访问数据。请随意总结要点并与我分享,这样我可以添加评论代码并回答更详细的问题。当然,我会尽快开始!非常感谢!嗨,Peter,我遵循了你关于书籍和firebase的教程,非常有帮助,我很好地清理了我的代码。不幸的是,当我在firestore上添加集合时,仍然无法更新应用程序UI。我可以在哪里向您发送我的代码,以便您按照之前的要求进行检查?谢谢请随意在GitHub上创建(私人)回购并与我共享。我一直在遵循您的教程,如果我明白了这一点,我有一个API文件,根据您的建议,它应该是PatientPository和func addPatient,我把它放在PatientAPI中,我可以简单地将PatientViewModel和所有必要的函数(删除、更新等)放在一起,因此存储库是将所有与数据访问相关的代码封装在一个地方的好方法。在视图模型中,然后使用存储库的方法以视图需要的方式访问数据。请随意总结要点并与我分享,这样我可以添加评论代码并回答更详细的问题。当然,我会尽快开始!非常感谢!嗨,Peter,我遵循了你关于书籍和firebase的教程,非常有帮助,我很好地清理了我的代码。不幸的是,当我在firestore上添加集合时,仍然无法更新应用程序UI。我可以在哪里向您发送我的代码,以便您按照之前的要求进行检查?谢谢请随意在GitHub上创建(私人)回购协议并与我共享。