【问题标题】:Converting maps from Firestore to dictionary in Swift在 Swift 中将地图从 Firestore 转换为字典
【发布时间】:2020-05-09 22:08:54
【问题描述】:

我正在创建一个订单系统,为此,我将用户的购物车与地图一起存储在 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)
    }

}

}

【问题讨论】:

  • 描述问题是一个好的开始,但我们确实需要了解您的 firebase 结构以及您尝试过的代码。有点不清楚实际问题是什么 - 从 Firestore 读取数据已包含在入门指南中,因此这是一个很好的参考点。
  • @Jay 编辑了我的 firebase 结构,希望对您有所帮助。谢谢你:)

标签: swift firebase dictionary google-cloud-firestore


【解决方案1】:

我可能不完全理解这个问题,但我认为您问的是如何从 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)
}

【讨论】:

  • 还有一个问题,您使用 "let orderDict = mappedField?.get("drinks") as![String: String],我将如何遍历所述文档中的每个地图 ("user_0")不知道他们的名字?尝试了 ForEach 循环、索引循环等,但它们都没有按照我希望的方式工作。基本上,如果有不同的字典,我不知道它们的键,但我想要检索所有这些。我该怎么做?非常感谢您的帮助,谢谢。
  • @sk.42 您是否在问如何遍历每个键:字典中的值对?我用编辑更新了我的答案以显示两个选项。
  • 我还有一个问题,我不太明白如何解决,但我不想为此开一个新帖子。要获取我的文档,我必须提供一个集合(饮料)和一个文档名称(例如 user_0),现在要获取该文档名称,我必须调用我的类 UserData() 来收集所有用户的数据。我在上面的问题中在课堂上进行了编辑。现在的问题是我无法在我的 init() 函数中访问 UserData() 信息。我该如何解决这个问题?因为否则我将无法获取订单文档名称的用户数据。
  • @sk.42 不确定我是否理解这个问题......通常,某些用户数据存储在文档中,其 uid 为 documentId。然后,一旦用户进行身份验证,您就可以从 Auth().current 用户对象中检索他们的 uid,然后您就会知道他们数据的路径。现在...您是说 无法在我的 init() 函数中访问 UserData() 信息 - 为什么不呢?是什么阻止你这样做?如果还有更多内容,最好打开另一个问题,这样我们就不会离开主题
  • 我打开了另一个关于我的问题的帖子,如果你理解我的问题,也许你也可以看看。非常感谢:) stackoverflow.com/questions/62012986/…
猜你喜欢
  • 2018-11-26
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2016-11-02
  • 2021-10-02
相关资源
最近更新 更多