swift - 在 Swift 中将地图从 Firestore 转换为字典
问题描述
我正在创建一个订单系统,为此,我将用户的购物车与地图一起存储在 Firestore 中,因此该集合将被称为“购物车”,然后文档将保存为用户的 UID 并保存在文档内部应该是带有他订购的东西、这些东西的数量和价格的地图,例如,他订购了 4 件东西,为此有 4 张地图,其中有物品名称、数量和存储的价格。
现在我不知道如何在 Swift 中从 Firebase 检索这些数据并将其保存在字典中。对于其他数据类型,我总是使用 SnapshotListener,但我真的不知道它如何处理我想保存在字典中的地图中的数据。
编辑:我的 firebase 结构是这样的,我想将这些数据(项目名称、数量、价格)保存在 Swift 的一个字典中,以便我可以将这些信息作为一个传递。
编辑2:
class readDrinksFromDb: ObservableObject {
@Published var items = [Item]()
@ObservedObject var userInfo = UserData()
init () {
let db = Firestore.firestore()
let itemsRef = db.collection("drinks")
let loungeRef = itemsRef.document(userInfo.user.reserviert) // Should get the lounge Name -> XYZ Lounge
loungeRef.getDocument { (snap, err) in
if let err = err {
print(err.localizedDescription)
return
}
guard let snap = snap else { return }
guard let dict = snap.data() else { return }
dict.forEach { i in
let orderItems = dict[i.key] as! [String: String]
let id = orderItems["id"] ?? ""
let price = orderItems["price"] ?? ""
let pic = orderItems["pic"] ?? ""
let name = orderItems["name"] ?? ""
self.items.append(Item(id: id, name: name, price: price, pic: pic, lounge: "Rebell Lounge", type: "drinks"))
}
print(self.items)
}
}
}
解决方案
我可能不完全理解这个问题,但我认为您是在问如何从 Firestore 中的文档中读取数据并访问子数据。
我包括两个示例,一个使用字典获取数据,第二个使用.map。首先通读第一部分,因为它最能说明数据之间的关系
字典:
如果是这样,假设用户 uid 是“user_0”,我们将读取最顶层的文档,其中用户 uid 作为 documentId。
获得文档后,我们使用 .data 属性将所有数据作为字典获取。
guard let dict = snap.data() else { return }
然后,我们感兴趣的字段(字典键)称为“drinks”,因此我们使用“drinks”键来获取它的值(这是另一个字典)
let orderItems = dict["drinks"] as! [String: String]
整体结构是这样的
["drinks": {
item = fanta;
price = "4.50";
quantity = 2;
}]
如您所见,drinks 是键,然后商品、价格和数量是与该键关联的值
然后,将这些项目转换为 orderItems 变量
let orderItems = dict["drinks"] as! [String: String]
这也是一个字典,包含您想要的数据的键和值
func readOrder() {
let orderRef = self.db.collection("orders") //self.db = my Firestore
let thisUser = orderRef.document("user_0")
thisUser.getDocument(completion: { snapshot, error in
if let err = error {
print(err.localizedDescription)
return
}
guard let snap = snapshot else { return }
guard let dict = snap.data() else { return }
let orderItems = dict["drinks"] as! [String: String]
let item = orderItems["item"] ?? "No Item"
let price = orderItems["price"] ?? "No Price"
let qty = orderItems["quantity"] ?? "No Quantity"
print(item, price, qty)
})
}
使用 .map
func readOrder() {
let orderRef = self.db.collection("orders")
let thisUser = orderRef.document("user_0")
thisUser.getDocument(completion: { snapshot, error in
if let err = error {
print(err.localizedDescription)
return
}
let mappedField = snapshot.map {$0}
let orderDict = mappedField?.get("drinks") as! [String: String]
let item = orderDict["item"] ?? "No Item"
let created = orderDict["price"] ?? "No Price"
let age = orderDict["quantity"] ?? "No qty"
print(item, created, age)
})
}
编辑
回应有关如何遍历字典以获取其键:值对的评论。这里有两个选项
for (key, value) in dict {
print(key, value)
}
dict.forEach { key, value in
print(key, value)
}
推荐阅读
- java - 如何修复 ServerSocket 只执行第一个收到的命令?
- nginx - 为字体制作 CDN 时遇到问题,跨域问题
- arrays - Shell中的数组操作
- r - 使用“last”和“lag”时子集“维数不正确”中的错误
- perl - 如何为 firefox 添加 extra_capabilities 以使用 perl 使用 selenium 进行测试?
- c# - 从 MySQL 数据库中获取数百万行并写入 csv 的性能缓慢
- javascript - 覆盖 HTML DOM 元素方法 JS
- java - 在Android设备上按下后退按钮后吐司没有完成?
- prolog - 如何计算列表中列表的所有长度?
- windows - stdole2.tlb Windows 10 与早期版本 Windows 上的 stdole2.tlb