我这样设置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)
答案 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)
}
})