【发布时间】:2020-12-28 04:05:13
【问题描述】:
我正在制作一个订购应用程序,供客户订购他们的特定规格。当用户登录时,他们可以转到一个包含所有规格的表格视图的选项卡,一旦他们单击一个单元格,它将带他们到一个新的视图控制器,该控制器将显示有关规格的更多信息。一旦在此视图控制器上,他们将能够添加该项目的 x 数量的托盘/卷/等。我可以将规范添加到 Firestore,但我无法将它添加到我需要的 Firestore 中的数组中。我的目标是,在另一个选项卡上,用户可以查看他们尝试订购的所有当前规格,直到他们点击提交。我目前正在使用 user.uid 来获取 Firestore 内的特定客户订单。
代码: @IBAction func addPallet(_ sender: Any) {
// Get the current user
let user = Auth.auth().currentUser
if let user = user {
_ = user.uid
}
if spec != nil {
// Get the qty ordered for that spec
let totalQty: Int? = Int(palletsToAddTextField.text!)
let qty = spec!.palletCount * totalQty!
let specToAdd = Spec(specNumber: spec!.specNumber,
specDescription: spec!.specDescription,
palletCount: spec!.palletCount,
palletsOrdered: qty)
orderedArray.append(specToAdd)
let specAdded: [String: Any] = [
"SpecDesc": spec!.specDescription,
"SpecNum": spec!.specNumber,
"PalletCount": spec!.palletCount,
"PalletsOrder": qty
]
db.collection("orders").document(user?.uid ?? "error").setData(specAdded) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
print("Document successfully written!")
}
}
}
}
规范代码: 结构规范:可编码 {
// Properties
var specNumber: String
var specDescription: String
var palletCount: Int
var palletsOrdered = 0
enum CodingKeys: String, CodingKey {
case specNumber
case specDescription
case palletCount
case palletsOrdered
}
}
我需要添加如下图所示的内容。用户将添加 x 个托盘,然后转到他们想要的下一个规范并将其添加到 Firestore 中的数组中。
【问题讨论】:
-
您必须将规范字段(在数据库中)视为一个数组。要将元素附加到 Firestore 中的数组,您必须获取数组,解包,将元素添加到其中,然后使用新数组更新文档,或者使用
arrayUnion附加元素而无需先读取它。 firebase.google.com/docs/firestore/manage-data/… -
Firestore 中的数组的工作方式与您在 iOS 中习惯的略有不同。例如,如果您只使用
arrayUnion,则该数组将永远不会包含重复项(从这个意义上说,它的操作更像是一个集合而不是一个数组,这很有用)。但是,如果您直接编写包含重复项的数组(不使用arrayUnion),则这些重复项将保留。阅读此书作为入门读物:firebase.googleblog.com/2018/08/…
标签: ios swift firebase google-cloud-firestore swift5