在Swift中检索深度嵌套的Firebase数据

时间:2018-06-25 06:01:08

标签: swift firebase firebase-realtime-database

这是我在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 :(得分:1)

我不是Apple开发人员,但我会尽力提供帮助:

好吧,似乎您有登录到您应用程序的用户,并将其uid保存在“用户”节点下。

假设我正在分析此权利:

您有3个嵌套级别(随机ID)。

级别1:是用户的uid。

级别2:是每个用户的汽车ID。

级别3:每辆车的成本ID。

如果您可以引用这3个ID,则会读取所需的数据。

级别1:如果您的用户仅登录其auth uid,则此操作很容易。

级别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)
}

答案 1 :(得分:0)

感谢您的帮助。一开始我还不太清楚,但是由于您的回答,我想出了一个解决方案。

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