0

我需要检索购物车子项中每个产品的价格值,但我应该如何检索它并将检索到的值加在一起?

我的 Firebase 数据库结构图

let uid = Auth.auth().currentUser?.uid
    refProduct = Database.database().reference().child("users").child(uid!).child("cart")
    refProduct.observeSingleEvent(of: .value) { (snapshot) in
        for cartchild in snapshot.children{
            let snap = cartchild as! DataSnapshot
            let key = snap.value
            .....


        }
    }
4

2 回答 2

0

我不会将价格存储为字符串,而是存储为数字。如果需要,您可能希望添加另一个带有货币的字段。

guard let uid = Auth.auth().currentUser?.uid else { return }
var sum: Double = 0
refProduct = Database.database().reference().child("users").child(uid).child("cart")
refProduct.observeSingleEvent(of: .value) { (snapshot) in
   for cartchild in snapshot.children{
       let snap = cartchild as! DataSnapshot
       let data = snap.value as? [String: Any]
       let price = data["ProductPrice"] as? Double ?? 0
       sum += price
   }
   print("Final sum: \(sum)")
}

没有真正测试过,但这就是想法

于 2019-05-17T17:37:39.127 回答
0

Arvidurs 将价格存储为 aint并将货币存储为 a 是正确的string,但答案对您不起作用的原因是它没有解决您没有正确检索您想要的数据的问题。

您有您的cart文件夹,它包含两个您要检索其属性的产品文件夹。您无法仅通过引用父文件夹来检索和解包这两个文件夹中包含的值cart。您需要单独访问购物车中的每个文件夹:

 Database.database().reference().child("users").child(uid).child("cart").child("-Lf59bkQ5X3ivD6ue1SA")
Database.database().reference().child("users").child(uid).child("cart").child("-Lf5MiEGU357HWTMbxv8")

但是,要使其正常工作,您需要访问每个产品autoID的值,因此您需要将每个新产品的childByAutoID值存储到数组或字典中,以便您可以将它们全部用于访问您需要的任何数据。当您将新产品存储到cart文件夹时,您需要实现这一点。我不确切知道您当前如何保存每个产品,但是当您创建要保存到的参考时,您需要执行以下操作:

let newProductRef = Database.database().reference().child("users").child(uid).child("cart").childByAutoId()
       let autoID = newProductRef.key

那时,您将能够存储autoID您选择的任何内容,并且可以访问cart文件夹中的所有内容,并且可以遍历所有内容autoIDs并获取所需的任何数据。示例

 func getCartPriceSum(finished: @escaping ([String : Double]) -> Void){
       let myGroup = DispatchGroup()
        var sum = Double()
        var currency = String()
        for autoID in autoIdArray{
            myGroup.enter()
            let productRef = Database.database().reference().child("users").child(uid).child("cart").child(autoID)
            productRef.observe(.value) { (snapshot) in
                guard
                    let snapshotValue = snapshot.value as? NSDictionary,
                    let productPrice = snapshotValue["ProductPrice"] as? Double,
                    let priceCurrency = snapshotValue["PriceCurrency"] as? String//assuming you've adopted Arvidurs' method of storing the price data
                    else {
                        print("productPrice/priceCurreny nil")
                        return
                }

                sum += productPrice
                currency = priceCurrency
            }
       myGroup.leave()
        }

        let priceSum = [currency : sum]
        myGroup.notify(queue: .main) {
            finished(priceSum)


        }
    }

你可以这样调用函数:

 getCartPriceSum { (priceSum) in
            //do whatever you want with the priceSum
        }

您唯一需要弄清楚的是您希望如何存储这些 autoID。

于 2019-05-17T19:08:42.793 回答