问题描述
我正在尝试制作一个使用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())")
}
}
}
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]