Firebase-Swift Как суммировать дочерние значения вместе - PullRequest
0 голосов
/ 17 мая 2019

Мне нужно получить значение цены каждого товара в дочерней корзине, но как мне его извлечь и суммировать полученное значение вместе?

Изображение структуры моей базы данных 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
            .....


        }
    }

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

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, и вы можете просмотреть все свои 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
        }

Вам остается только выяснить, как вы хотите хранить эти автоидентификаторы.

0 голосов
/ 17 мая 2019

Я не буду хранить цену в виде строки, а в виде числа.Вы можете добавить другое поле с валютой, если это необходимо.

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)")
}

На самом деле не проверено, но это идея

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...