在Swift中获取Firebase子数据

时间:2018-02-02 13:50:15

标签: ios swift firebase-realtime-database

我已经在Xcode 9上设置了Firebase。

我的问题: 我想从Firebase检索数据。这有效,但是当我在组中添加另一个文本时,它将无法检索。

示例

火力:

lang :

  "Deutsch"

  "Englisch"

Firebase图片示例,因为很难解释:

Firebase Image Example beacause it's difficult to explain

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”

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

现在您检索整个lang节点。因此,您从Firebase获得的snapshot包含"de": "Deutch""en": "English"。当您现在执行snapshot.value as? String时,它会返回nil,因为快照没有单个简单的字符串值。

要获取特定值,首先需要告诉快照您想要哪个子属性:deen然后您可以获取字符串值。

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

每当处理字典方法时,每次硬编码字符串键都是危险的。这很容易出错。我建议您创建一个包含每个键的结构,这样您就不需要在每次需要时键入字符串。