Firebase-Swift如何将子值加在一起

时间:2019-05-17 15:53:02

标签: swift firebase-realtime-database

我需要检索购物车子项中每种产品的价格值,但是我应该如何检索它并将求出的值加起来呢?

Picture of my Firebase database structure

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
            .....


        }
    }

2 个答案:

答案 0 :(得分: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)")
}

尚未经过实际测试,但这是个主意

答案 1 :(得分:0)

Arvidurs关于将价格存储为int和将货币存储为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文件夹中的所有内容,并且可以遍历所有{{ 1}},并获取所需的任何数据。 示例

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)


        }
    }

您唯一需要了解的就是如何存储这些自动ID。