使用来自firebase的Swift pull数据

时间:2017-12-12 19:14:53

标签: swift firebase firebase-realtime-database

这就是我的Firebase的样子

Firebase ScreenShot

enter image description here

这是我的代码

override func viewDidLoad() {
    var sum = 0
    var counter = 0
    super.viewDidLoad()
    ref = Database.database().reference()
    ref.child("WaterAdded").observe(.childAdded, with: { (snapshot) in
        if let totalwateradded = snapshot.value as? [Int]{
            while counter < (totalwateradded.count) {
                var newValue = totalwateradded[counter]
                sum += newValue
            }
        self.totalAdded.text = "\(sum)"
        }
    })
}

我想获取Firebase中的所有数字并显示总和。但它没有显示任何内容。

3 个答案:

答案 0 :(得分:0)

尝试...

if let snap = snapshot.value as? Dictionary [Sting: Any], let totalWaterAdded = 
snap["\(yourDictionaryKey)"] as? Int{
//enter your code...
}

答案 1 :(得分:0)

你无法直接将snapshot.value转换为[Int],而是想要获取节点中的所有对象,你应该使用

 let ref = Database.database().reference()
    ref.child("WaterAdded").observe(.childAdded, with: { (snapshot) in
        if let water = snapshot.value as? String{
          guard let waterAmount = Int(water) else{return}
          sum += waterAmount

        }
    })

不需要while循环,因为这将为您提供数据库中的所有值。

修改

在数据库中,您可以使用字符串和Ints来存储数字。您将它们存储为字符串。如果在Swift中加载它们,则必须有条件地将值转换为String(如?String)。但问题是您不能对字符串执行任何算术运算,因此使用Int(water)语句可以将其转换为Int。如果字符串包含数字,则此操作可以给出字符串中的整数,但也可能失败(例如Int(&#34; 2&#34;))因此我们使用guard let来确保我们只进入下一行如果它可以成功转换为Int。之后我们只需将int值添加到sum和done中。

答案 2 :(得分:0)

这里是读取节点的答案,将值相加并将其打印到控制台。

let ref = self.ref.child("WaterAdded")
ref.observeSingleEvent(of: .value, with: { snapshot in
    var x = 0
    for child in snapshot.children {
        let val = (child as! DataSnapshot).value as! Int
        x = x +  val
    }
    print("sum: \(x)")
})

我们在这种情况下使用了.value的observeSingleEvent,因为当我们可以在代码中更快地完成它时,firebase就没有理由迭代每个子节点。此外,我们不需要收到有关子女事件的通知。

在混合中抛出一个警卫声明可能是一个好主意,但只要你确定这些数值只是Int,那就不错了。

使用以下结构进行测试

WaterAdded
   a: 0
   b: 1
   c: 2
   d: 3

,输出

6