在 "User" 下使用 Firebase 添加和检索多个值

Adding and Retrieving multiple values with Firebase under "User"

我正在这样上传我的数据:

通过使用这些函数:

extension Database {

func createPurchase (purchaseID : String, quantity: String, completion: @escaping (Error?) -> ()){

    guard let uid = Auth.auth().currentUser?.uid else { return }

    let userPostRef = Database.database().reference().child("purchases").child(uid) //taken off auto ID
    let values = ["purchase" : purchaseID, "quantity" : quantity ] as [String: Any]

                    userPostRef.updateChildValues(values) { (err, ref) in
            if let err = err {
                print("Failed to save purchase to database", err)
                completion(err)
                return
            }
            completion(nil)
        }
    }

}

.

在Viewcontroller 1:

func callID (){
    let itemCount = CartController.shared.items.count

    for i in 0...itemCount-1 {

        let quantity = CartController.shared.items[i].quantity
        let quantity1 = String(quantity)
        let item = CartController.shared.items[i].product.id

        Database.database().createPurchase(purchaseID: item, quantity: quantity1 ) { (err) in
            if err != nil {
                print("error uploading purchase to Firebase ")
                return
            }
        }
    }
}

callID 使用 createPurchase 获取每个产品的 sku 编号及其数量并上传到 firebase。 但是,它会覆盖之前上传的内容。所以当我加载超过 1 种产品时。它只留下最后的产品 sku 和数量。 对于此示例,我从 3 个产品开始,但只上传了 1 个(最后一个)。 我怎样才能上传所有数据。即停止这个覆盖?

这是我检索它的方式:

extension Database {
    func fetchPurchase(withUID uid: String, completion: @escaping (Purchase) -> ()) {
        Database.database().reference().child("purchases").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
            guard let userDictionary = snapshot.value as? [String: Any] else { return }

            let purchase = Purchase(uid: uid, dictionary: userDictionary)
            completion(purchase)
        }) { (err) in
            print("Failed to fetch purchase from database:", err)
        }
    }
}

.

在viewcontroller 2:

struct Purchase {

    let uid: String
    let purchases: String
    let quantities: String


    init(uid: String, dictionary: [String: Any]) {
        self.uid = uid
        self.purchases = dictionary["purchase"] as? String ?? ""
        self.quantities = dictionary["quantity"] as? String ?? ""

    }
}

var myPurchases: [Purchase] = []

private func fetchPurchaseForCurrentUser() {
    guard let currentLoggedInUserId = Auth.auth().currentUser?.uid else { return }
    Database.database().fetchPurchase(withUID: currentLoggedInUserId, completion: { (purchases) in
        self.myPurchases.append(purchases)
        print("myPurchases", self.myPurchases)
    })
}

这是我得到的打印输出:

myPurchases [myShop.Purchase(uid: "Tgb9MyxTfdTRd9tQhInsjNRXoPL2", purchases: "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0Lzk4OTUzMDk2OTk=", quantities: "2")]

这只显示了一种产品,但我需要有多种产品。

请帮忙!

编辑:

这是我使用ChildByAutoId()时的截图。 我得到了所有产品(在这种情况下为 2)。 但是我无法从快照中检索信息并设置到我的文本字段?

从多条记录中准备一个数组,示例代码:

var myPurchases: [Purchase] = []
for (key, value) in userDictionary {
    guard let dic = value as? [String: Any] else {
         continue
    }

    let purchaseModel = Purchase(uid: key, dictionary: dic)
    myPurchases.append(purchaseModel)
}