提问者:小点点

如何读取云Firestore中的项目并将其写入Swift中的列表中?


我的问题会很简单。

现在我可以自由地将项目添加到我的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)
                }
            }
        }
    }

它应该显示我添加的项目。


共1个答案

匿名用户

首先,我会考虑重新格式化您的编写代码,而不需要进行所有的强制解包装:

@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()方法是一个更干净的接口。