我的问题会很简单。
现在我可以自由地将项目添加到我的Cloud Firestore数据库中,但是我不知道如何正确地读取它们,因此我无法将它们加载到我的swift应用程序中的列表中。
Soo,写代码如下所示:
@IBAction func addItemButtonTouched(_ sender: Any) {
let itemName = itemNameField.text!;
let db = Firestore.firestore()
db.collection("recipes").addDocument(data: ["name": itemName, "uid": Auth.auth().currentUser!.uid]);
}
以及我试图在应用程序中读取并添加项目到列表中的尝试:
override func viewDidLoad() {
super.viewDidLoad()
let db = Firestore.firestore()
db.collection("recipes").whereField("uid", isEqualTo: Auth.auth().currentUser!.uid).getDocuments() { (querySnapshot, err) in
if let err = err {
//error
} else {
for document in querySnapshot!.documents {
elements.append(Element(name: document)) // <- there is a problem
}
}
}
}
我不确定如何从我的文档中读取名称,如果我尝试document.name.。。我得到一个错误:
类型“QueryDocumentSnapshot”的值没有成员“name”。
也许有人知道如何分配数据从数据库到我的列表在应用程序?
好的。现在可以编译了,但是我还是没有看到添加了标签的新项目。 它在DB中是可见的,但在App中不可见。
和后面的代码(加载):
override func viewDidLoad() {
super.viewDidLoad()
let db = Firestore.firestore()
db.collection("recipes").whereField("uid", isEqualTo: Auth.auth().currentUser!.uid).getDocuments() { (snapshot, err) in
if let snapshot = snapshot {
for doc in snapshot.documents {
if let itemName = doc.get("name") as? String {
self.elements.append(Element(name: itemName))
}
}
} else {
if let err = err {
print(err)
}
}
}
}
它应该显示我添加的项目。
首先,我会考虑重新格式化您的编写代码,而不需要进行所有的强制解包装:
@IBAction func addItemButtonTouched(_ sender: Any) {
guard let uid = Auth.auth().currentUser?.uid,
let name = itemNameField.text else {
return // return control to the caller or do something else to indicate access denied
}
Firestore.firestore().collection("recipes").addDocument(data: ["name": name, "uid": uid]);
}
我会很早就养成这种习惯,并提供nil
值的替代方法,而不是使整个应用程序崩溃。 要读取数据,我建议使用文档快照的get()
方法:
override func viewDidLoad() {
super.viewDidLoad()
Firestore.firestore().collection("recipes").whereField("uid", isEqualTo: Auth.auth().currentUser!.uid).getDocuments() { (snapshot, err) in
if let snapshot = snapshot {
for doc in snapshot.documents {
if let name = doc.get("name") as? String {
elements.append(name)
}
}
} else {
if let err = err {
print(err)
}
// handle the error gracefully
// never force unwrap Firestore's snapshots because
// there is no guarantee that everything came in neatly
// which is the case when dealing with any network
// process with any API, not just Firestore
}
}
}
有些人选择使用data()
访问文档快照的原始数据,然后从[string:Any]
字典中获取值,但我认为get()
方法是一个更干净的接口。