Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中将地图从Firestore转换为字典_Swift_Firebase_Dictionary_Google Cloud Firestore - Fatal编程技术网

在Swift中将地图从Firestore转换为字典

在Swift中将地图从Firestore转换为字典,swift,firebase,dictionary,google-cloud-firestore,Swift,Firebase,Dictionary,Google Cloud Firestore,我正在创建一个订单系统,为此,我将用户的购物车与地图一起存储在Firestore中,因此该集合将被称为“购物车”,然后该文档将被保存为用户的UID,并且在文档内部应该有地图,上面有他订购的东西、这些东西的数量和价格,例如,他订购了4件物品,其中有4张地图,上面有物品名称、数量和价格 现在我不知道如何在Swift中从Firebase检索这些数据并将其保存在字典中。对于其他数据类型,我总是使用SnapshotListener,但我真的不知道对于要保存在字典中的地图中的数据,该如何工作 编辑: 我的f

我正在创建一个订单系统,为此,我将用户的购物车与地图一起存储在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\u 0”,我们将读取最顶层的文档,其中用户uid作为文档ID

获得文档后,我们使用.data属性将所有数据作为字典获取

guard let dict = snap.data() else { return }
然后,我们感兴趣的字段(字典键)被称为“drinks”,因此我们使用“drinks”键来获取它的值(这是另一个字典)

整体结构如下所示

["drinks": {
    item = fanta;
    price = "4.50";
    quantity = 2;
}]
正如您所看到的,饮料是关键,然后项目、价格和数量是与该关键关联的值

然后,将这些项转换为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)
}

描述这个问题是一个良好的开端,但我们确实需要了解您的firebase结构以及您尝试过的代码。现在还不清楚真正的问题是什么-从Firestore读取数据包含在入门指南中,所以这是一个很好的参考点。@Jay在中编辑了我的firebase结构,希望这能有所帮助。谢谢:)还有一个问题,您使用“let orderDict=mappedField?”.get(“饮料”)作为![String:String],我将如何遍历所述文档中的每个地图(“用户0”)不知道它们的名称?尝试了ForEach循环、索引循环等,但它们都不是我希望它们工作的方式。基本上,如果有不同的字典,我不知道它们的键,但我想检索它们。我将如何具体做到这一点?非常感谢您的帮助,谢谢。@sk.42您在询问吗如何迭代字典中的每个键:值对?我用编辑更新了我的答案,以显示两个选项。我还有一个问题,我真的不知道如何修复它,但我不想为此打开一个新线程。要访问我的文档,我必须提供一个集合(饮料)和一个文档名(例如用户\ 0),现在要获得该文档名,我必须调用我的类UserData(),它收集所有用户的数据。我在我的类中编辑了上述问题。现在的问题是,我无法访问init()中的UserData()信息函数。如何解决此问题?因为否则我将无法获取订单文档名的用户数据。@sk.42我不确定是否理解此问题……通常,某些用户的数据存储在文档中,其uid为documentId。然后,一旦用户进行身份验证,您就可以从Auth()检索其uid.current user对象,则您将知道其数据的路径。现在…您是说无法访问my init()中的UserData()信息功能-为什么不?是什么阻止了你这么做?如果还有更多的问题,可能最好打开另一个问题,这样我们就不会把这个问题从topicI上删除。我打开了另一个关于我的问题的线程,如果你理解我的问题,也许你也可以看看。非常感谢:)
for (key, value) in dict {
    print(key, value)
}

dict.forEach { key, value in
    print(key, value)
}