我已经在Xcode 9上设置了Firebase。
我的问题: 我想从Firebase检索数据。这有效,但是当我在组中添加另一个文本时,它将无法检索。
示例
火力:
lang :
"Deutsch"
"Englisch"
Firebase图片示例,因为很难解释:
import UIKit
import FirebaseDatabase
class ViewController: UIViewController {
@IBOutlet weak var outputone: UILabel!
// @IBOutlet weak var outputtwo: UILabel!
var dbReference: DatabaseReference?
var dbHandle: DatabaseHandle?
override func viewDidLoad() {
super.viewDidLoad()
dbReference = Database.database().reference()
// dbReference?.child("lang").childByAutoId().setValue("Deutsch")
// dbReference?.child("lang").childByAutoId().setValue("Englisch")
// retrieve data
dbHandle = dbReference?.child("lang").observe(.childAdded, with:{ (snapshot) in
let lang:String? = snapshot.value as? String
self.outputone.text = (lang)
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我想在outputone中显示“Deutsch”,在outputtwo中显示“Englisch”
有人可以帮忙吗?
答案 0 :(得分:1)
现在您检索整个lang
节点。因此,您从Firebase获得的snapshot包含"de": "Deutch"
和"en": "English"
。当您现在执行snapshot.value as? String
时,它会返回nil
,因为快照没有单个简单的字符串值。
要获取特定值,首先需要告诉快照您想要哪个子属性:de
或en
,然后您可以获取字符串值。
dbHandle = dbReference?.child("lang").observe(.value, with:{(snapshot) in
let de:String? = snapshot.childSnapshot(forPath:"de").value as? String
let en:String? = snapshot.childSnapshot(forPath:"en").value as? String
self.outputone.text = (de)
self.outputtwo.text = (en)
})
答案 1 :(得分:0)
从Firebase检索数据时,它就像一个块。这是downCasting派上用场的时候。
db.session.commit()
每当处理字典方法时,每次硬编码字符串键都是危险的。这很容易出错。我建议您创建一个包含每个键的结构,这样您就不需要在每次需要时键入字符串。