从Firebase中读取/检索数据

时间:2017-05-08 23:55:46

标签: ios firebase swift3 firebase-realtime-database

我是Swift 3的初学者(使用iOS 8.3)。我一直试图找出一种分离数据的方法,但没有运气。基本上,我可以从Firebase中提取以下数据:

 {
Database =     {
    Kelvin =         {
        Institution = xxx;
        "Years of Experience" = "2.5";
        location = London;
    };
    Sophia =         {
        Institution = xxxx;
        "Years of Experience" = 3;
        location = London;
    };
};
Users =     {
    SOOlIFsjn3839jcmlBbVEnSRH3 =         {
        email = "testing@gmail.com";
        password = 1234567;
    };
};
       }

但现在我想分开数据,以便显示如下内容:

        var ref: FIRDatabaseReference!
          ref = FIRDatabase.database().reference()
            ref.observe(FIRDataEventType.value, with: { (snapshot) in

            if let mydata = snapshot.value as? NSDictionary {
                print(mydata)

                 if let namedata = mydata["Database"] as? NSArray {
                    print(namedata[0])  //Prints Kelvin
                    print(namedata[1])  //Prints Sofia

                }

但是,Swift不允许我这样做,它告诉我我无法将一种NSDictionary转换为NSArray。有任何想法吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

Firebase集合是键值对。对于JSON的每个键,您可以找到相应的值。

所以你需要转换为NSDictionary的String,Object。该词典中的键将为KelvinSophia。每个值都是相应键下的值。

答案 1 :(得分:1)

从FIREBASE DATABASE读取/检索数据到NSDICTIONARY

每次更改时读取数据

您可以使用FIRDataEventTypeValue事件来读取给定路径上的数据,因为它在事件发生时存在。连接侦听器时会触发此方法,每次数据(包括任何子节点)发生更改时,都会触发此方法。事件回调传递一个快照,其中包含该位置的所有数据,包括子数据。如果没有数据,则返回的快照值为nil。

/*FIREBASE VALUE_EVENT_LISTENER */
func getModelFromFirebase(){

    var firDatabaseReference: FIRDatabaseReference!
    firDatabaseReference = FIRDatabase.database().reference(withPath: "referencePath")
    firDatabaseReference.child("referenceKey").child(bookingId).observe(FIRDataEventType.value, with: { (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        // Play with dict..

    }) { (error) in
        print(error.localizedDescription)
    }

}

一次读取数据

这对于只需要加载一次并且不会经常更改或需要主动监听的数据非常有用。例如,前面示例中的博客应用程序使用此方法在用户开始创作新帖子时加载用户的个人资料。

/* FIREBASE SINGLE_VALUE_EVENT_LISTENER */
func getModelFromFirebase(){

    var firDatabaseReference: FIRDatabaseReference!
    firDatabaseReference = FIRDatabase.database().reference(withPath: "referencePath")
    firDatabaseReference.child("referenceKey").observeSingleEvent(of: .value, with: { (snapshot) in
        // Get user value
        let value = snapshot.value as? NSDictionary
        // play with data Snapshot...

    }) { (error) in
        print(error.localizedDescription)
    }


}