这就是我的Firebase的样子
Firebase ScreenShot
这是我的代码
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中的所有数字并显示总和。但它没有显示任何内容。
答案 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