将Firestore数据分配给自定义对象

问题描述

我正在尝试制作一个使用Firestore来存储客户特定规格的应用程序。我有一个spec对象,目前只有几个属性,但是我需要获取数据并将其分配给新的Spec对象,然后将其附加到数组上以显示在tableView上。我不明白如何访问数组中的各个映射以将值分配给规范的每个属性。我目前已将其设置为在控制台中打印,因为每次我尝试从文档中分配一个值时,它都为nil。本质上,我需要将数据存储在客户下(所有客户的总列表),并且除其他数据外,还需要包含每个客户的specNumber,specDescription和palletCount的一系列规范。

示例:

Customer: Test
Specs:
3096:
    Description: 50#top
    pltCount: 250
3097:
    Description: 50#bottom
    pltCount: 250

Firestore数据: enter image description here

代码

    let settings = FirestoreSettings()
    
    Firestore.firestore().settings = settings
    
    db = Firestore.firestore()
    
    
    db.collection("customers/test/specs")//.whereField("isCustomer",isEqualTo: true)
        .getDocuments() { (querySnapshot,err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {

                    print("\(document.documentID) => \(document.data())")
                    
                }
            }
    }

Spec调用代码

struct Spec {
    
    // Properties
    var specNumber: String
    var specDescription: String
    var palletCount: Int
    //var palletsOrdered = 0

    init(specNum: Int,specDesc: String,pltCount: Int) {

        specNumber = "\(specNum)"
        specDescription = specDesc
        palletCount = pltCount

    } 
}

解决方法

您必须将对文档的访问与对文档中数据的访问分开(尝试一起进行)。您不能仅在集合上对文档或文档中的字段调用getDocuments()。因此,请尝试:{p>

db.collection("customers/test/specs").getDocuments()

然后从文档中获取数据:

db.collection("customers").getDocuments() { (snapshot,error) in ... }

这是我想像的您实际想要实现的非常简化的版本,具体取决于表/集合的重新加载方式(即时,例行或仅一次)。此外,每个文档都包含一系列规格,但是您要从集合中获取所有文档,这将为您提供大量规格,而没有任何说明哪个规格与哪个客户相关联。但是我怀疑这只是早期设置,您只是想首先获取API的句柄。

注意:Firestore中的地图在Swift中被称为字典,它们始终作为db.collection("customers").getDocuments() { (snapshot,error) in if let snapshot = snapshot { // lead by unwrapping the snapshot instead of the error for doc in snapshot.documents { // iterate through the documents guard let specs = doc.get("specs") as? [[String: Any]] else { continue // continue loop } for s in specs { // iterate through the array of specs if let specNum = s["SpecNum"] as? String,let specDesc = s["SpecDesc"] as? String,let pltCount = s["PalletCount"] as? Int { let spec = Spec(specNum: specNum,specDesc: specDesc,pltCount: pltCount) self.someArray.append(spec) } } self.tableView.reloadData() // loop is done,reload } } else { if let error = error { print(error) } } } 字典从Firestore中返回。这就是为什么当我们最初展开规格图时,将其转换为字典数组的原因:

[String: Any]