Как суммировать дочерние значения из firebase и хранить в метке. Firebase-Swift - PullRequest
0 голосов
/ 20 июня 2020

Вот скриншот моей базы данных

Я пытаюсь получить сумму всех значений Price из firebase. Это пример моего кода, который дает мне 0,0 в качестве вывода.

func getSum() {
    var sum: Double = 0
    ref.child("Value").child("-MAHj9q0INTElKixlCCi").child("Price").observeSingleEvent(of: .value) { (snapshot) in
        for child in snapshot.children{
            let snap = child as! DataSnapshot
            let data = snap.value as? [String: Any]
            let price = data!["Price"] as? Double ?? 0
            sum += price
       }
       print("Final sum: \(sum)")
    }
}

1 Ответ

0 голосов
/ 20 июня 2020

Ваш код загружает один конкретный c дочерний узел. Если вы хотите просуммировать все дочерние узлы, вы должны загрузить их все:

ref.child("Value").observeSingleEvent(of: .value) { (snapshot) in
  ...

Поскольку вы храните значения numeri c в виде строк в базе данных, вам нужно будет снова преобразовать их в числа в вашем коде.

let price = Double(data!["Price"] as? String ?? "0")

Остальная часть вашего кода кажется правильной для этого случая, насколько я могу видеть.

Начиная с

Немного более идиоматическая c версия этого кода будет выглядеть так:

ref.child("Value").observeSingleEvent(of: .value) { (snapshot) in
    var sum: Double = 0
    for snap in snapshot.children.allObjects as! [DataSnapshot] {
        let price = snap.childSnapshot(forPath: "Price").value as! String
        sum += Double(price)
   }
   print("Final sum: \(sum)")
}

Что здесь отличается:

  • Выполните жесткое приведение к [DataSnapshot] только один раз .
  • Используйте childSnapshot(forPath:) для поиска свойства Price.
  • Жесткое преобразование значения в String, так как свойство всегда существует в ваших данных и сохраняется как строка.
  • Преобразование строкового значения из базы данных в двойное, чтобы иметь возможность его суммировать.
...