Как получить значения базы данных Firebase для расчета среднего - PullRequest
0 голосов
/ 21 сентября 2018

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

Вот мой код:

 func observeStars() {

    guard let toId = users?.id else {
        return }
    let placesRef = Database.database().reference().child("Review")

    placesRef.observeSingleEvent(of: .value, with: { snapshot in

        for child in snapshot.children {

            let placeSnap = child as! DataSnapshot
            let ratingsSnap = placeSnap.childSnapshot(forPath: "STAR")
            print(ratingsSnap)
            let count = ratingsSnap.childrenCount
            var total: Double = 0.0
            for child in ratingsSnap.children {
                print(child)
                let snap = child as! DataSnapshot
                let val = snap.value as! Double
                total += val
            }
            let average = total/Double(count)
            print(average)

        }
    })
}

Моя структура базы данных firebase показана здесь:

{  
"Review" : {  

"75YFHCGX8WQyP3qlyvQKNohgCvQ2" : {  
  "-LM9OW1eLcS9yr3JZxP5" : {  
    "FROM" : "AV4RFwIlSNdnryfPPCl6SfLOzBZ2",  
    "STAR" : 3,  

    "TIMESTAMP" : 1.5366990112576609E9,  
    "TO" : "75YFHCGX8WQyP3qlyvQKNohgCvQ2"  
  },  

  "-LM9OoyD8A8HWZ387Ln9" : {  
    "FROM" : "MAc9ouJnAacHddqDMRet3K9SkZq1",  
    "STAR" : 2,  

    "TIMESTAMP" : 1.5366990928939629E9,  
    "TO" : "75YFHCGX8WQyP3qlyvQKNohgCvQ2"  
  }  
},  

"MAc9ouJnAacHddqDMRet3K9SkZq1" : {  
  "-LM9Oa1zGbRjdCERwoDX" : {  
    "FROM" : "AV4RFwIlSNdnryfPPCl6SfLOzBZ2",  
    "STAR" : 4,  

    "TIMESTAMP" : 1.536699031758939E9,  
    "TO" : "MAc9ouJnAacHddqDMRet3K9SkZq1"  
  }  
}  

Я хотел бы использовать дочерний узел "STAR" для моегорасчеты

Пожалуйста, любая помощь будет оценена!

1 Ответ

0 голосов
/ 21 сентября 2018

Вот проблема;структура, вероятно, слишком глубока, и ваш код не соответствует структуре.

Вы наблюдаете узел обзора, который имеет два дочерних узла

Review
   -75YFH...
   -MAc9ou...

, и имейте в виду эти дочерние узлы.узлы также имеют дочерние узлы.

-7590W...
   -LM90W...
   -LM90o...
-MAc9ou...
   -LM90a

Цикл for зацикливается на дочерних узлах верхнего уровня -75YFH и -MAc9ou, так что этот код

let placeSnap = child as! DataSnapshot
let ratingsSnap = placeSnap.childSnapshot(forPath: "STAR")

действительно

let ratingsSnap = -75YFH.childSnapshot(forPath: "STAR")

и

let ratingsSnap = -MAc9ou.childSnapshot(forPath: "STAR")

и, как вы можете видеть, STAR не является дочерним элементом этих узлов.

В зависимости от вашей структуры внутри каждого из двух верхних узлов необходим другой циклиз -75YFH и -MAc9ou для итерации по своим дочерним элементам и получения узла STAR

   var counter = 0      
   placesRef.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children { //this is -75YFH and -MAc9ou
            let placeSnap = child as! DataSnapshot 
            for childOfPlace in placeSnap.children { //this is -LM90W and -LM90o
                 let childOfPlaceSnap = childOfPlace as! DataSnapshot                     
                 //let ratingsSnap = childOfPlaceSnap.childSnapshot(forPath: "STAR")
                 //I prefer the following...
                 let dict = childOfPlaceSnap.value as! [String: Any]
                 let val = dict["STAR"] as! Int
                 counter += val
            }
        }
        print("total stars: \(counter)") //or tableView.reloadData()
    })

Примечание: набрал этот код на моем iPad, чтобы он не тестировался, поэтому не копируйте вставку.Концепция звука.

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