我无法从Firebase数据库检索数据

时间:2019-07-13 06:39:50

标签: ios swift firebase firebase-realtime-database

我这样设置Firebase数据库:

dataS
- LjYal4ijEdjfafe
  - email: "abc@xxx.org"
  - firstname: "aa"
  - lastname: "bb"

我无法检索数据“姓氏”,它总是返回nil。

let ref = Database.database().reference()
ref.queryOrdered(byChild: "email").queryEqual(toValue: email1).observeSingleEvent(of: .value, with: { (snapshot) in
    if !snapshot.exists() {
        print("cannot find in firebase")
        return
    }

    let value1 = snapshot.value as? NSDictionary
    let lastnameP = value1?["lastname"] as? String ?? ""

    print(lastnameP)

1 个答案:

答案 0 :(得分:1)

代码存在一些问题。

第一个是通过.value进行观察时,无论是1还是1000,都将返回所有匹配项,因此即使返回1,也需要迭代返回的DataSnapshot来访问子数据。如果使用.childAdded ,如果使用.observe,它将一次在快照中返回一个,而使用.childAdded仅返回第一个。

第二件事是引用指向根引用。看来dataS可能是根的子代

root_firebase
   dataS
      uid
         email
         firstname
         lastname

如果没有,请记住此代码与该结构匹配。

最后一件事是使它更快速,并使用现代函数调用并添加一些错误检查,以防在读取节点时找不到姓氏节点。

let email1 = "email to query for"
let ref = Database.database().reference()
let nodeToQueryRef = ref.child("dataS")
nodeToQueryRef.queryOrdered(byChild: "email")
              .queryEqual(toValue: email1)
              .observeSingleEvent(of: .value, with: { snapshot in
    if snapshot.exists() == false {
        print("cannot find in firebase")
        return
    }

    let returnedSnapshotArray = snapshot.children.allObjects as! [DataSnapshot]
    for snap in returnedSnapshotArray {
        let key = snap.key
        let lastName = snap.childSnapshot(forPath: "lastname").value as? String ?? "No Last Name"
        print(key, lastName)
    }
})