Получить глубоко вложенные данные Firebase в Swift - PullRequest
0 голосов
/ 25 июня 2018

это мой первый вопрос здесь на SO, но я постараюсь быть наиболее точным. Я просмотрел все возможные темы, но не нашел ответа. У меня есть база данных, как на картинке. Я пытаюсь извлечь "costAmount" из всех записей и сделать из него сумму, а затем показать ее на панели навигации. Проблема в том, что я не знаю, как получить доступ к этому уровню данных. Есть предложения?

Структура базы данных

enter image description here

Это то, что я придумал.

func showTitle() {
    let title = UILabel()
    var sum = 0
    title.text = "\(sum)"
    self.navigationItem.titleView = title

    let ref = Database.database().reference()
    ref.child("Users/\(currentUser!)/cars/\((car?.identifier)!)/Costs/costAmount").observe(.childAdded, with: { (snapshot) in
        if let cost = snapshot.value as? String {
            guard let totalCost = Int(cost) else {return}
            sum += totalCost
        }

    })

}

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Спасибо за помощь. Сначала я не совсем понимал, но благодаря вашим ответам я нашел решение.

func showTitle() {
    let title = UILabel()
    var sum = 0.0
    title.text = "\(sum)"
    self.navigationItem.titleView = title
    title.widthAnchor.constraint(equalToConstant: 100).isActive = true
    title.textAlignment = .center

    var ref: DatabaseReference!
    ref = Database.database().reference()


ref.child("Users/\(currentUser!)/cars/\((car?.identifier)!)/Costs").observe(.childAdded, with: { (snapshot) in

    let costObject = snapshot.value as? [String: AnyObject]
    let costAmount = costObject?["costAmount"] as! String?
    if let numericalCost = Double(costAmount!) {
        sum += numericalCost

        print(numericalCost)

    }

    title.text = "\(sum)"

    }) { (error) in
        print(error.localizedDescription)
    }
0 голосов
/ 25 июня 2018

Я не разработчик яблок, но постараюсь помочь:

Хорошо, похоже, что у вас есть пользователи, которые входят в ваше приложение, и вы сохраняете их uid под узлом пользователей.

Предполагая, что я анализирую это право:

У вас есть 3 уровня вложенности (случайные идентификаторы).

уровень 1: UID пользователей.

уровень 2. Идентификатор автомобилей для каждого пользователя.

уровень 3: идентификатор стоимости каждого автомобиля.

Если вы можете сослаться на эти 3 идентификатора, вы прочтете необходимые данные.

уровень 1: это легко, если ваши пользователи вошли в систему только с помощью идентификатора пользователя.

уровень 2: вы должны ссылаться на него, если, возможно, вы нажали на автомобиль определенного пользователя.

уровень 3: как и уровень 2, вы должны сохранить ссылку.

теперь код:

//database reference
var ref: DatabaseReference!
ref = Database.database().reference()

//user id (level 1)
let userID = Auth.auth().currentUser?.uid

//(level 2)
let carID = ...... its up to you to reference this
//(level 3)  
let CostID = ...... its up to you to reference this  


//read the costAmount

ref.child("Users").child(userID).child("cars").child(carID).child("Costs").child(CostID)
   .child("costAmount").observeSingleEvent(of: .value, with: { (snapshot) in

  // Get value
  let costAmount= snapshot.value as? Int


  // ...
  }) { (error) in
    print(error.localizedDescription)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...