ios - 我无法从 Firebase 数据库中检索数据
问题描述
我这样设置 Firebase 数据库:
数据S - LjYal4ijEdjfafe - 电子邮件:“abc@xxx.org” - 名字:“aa” - 姓氏:“bb”
而且我无法检索数据“姓氏”,它总是返回零。
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)
解决方案
代码存在一些问题。
第一种是通过 .value 观察时,无论是 1 还是 1000 都会返回所有匹配项,因此返回的 DataSnapshot 需要迭代才能访问子数据,即使有 1。如果使用 .childAdded,它将如果使用 .observe,则在快照中一次返回一个,并且只有第一个使用 .childAdded。
第二件事是引用指向根引用。看来 dataS 可能是根的孩子
root_firebase
dataS
uid
email
firstname
lastname
如果不是,请记住此代码与该结构匹配。
最后一件事是让它更 Swifty 并使用现代函数调用并添加一些错误检查,以防在读取节点时找不到 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)
}
})
推荐阅读
- angular - 使用组件中的变量动态填充图表
- amazon-web-services - 如何使用 Elastic Load Balancer 仅将流量限制到一个实例?
- python-2.7 - Python 2.7 strftime 类型错误
- r - 暂停闪亮会话并返回前端 UI
- jquery - 如何在另一个元素之后附加一个元素?
- jenkins - 错误:无法找到浏览器。“browserstack:Chrome@68.0:Windows 10”不是浏览器别名或可执行文件的路径
- python - 将循环的先前值用于下一个循环
- java - 将 CustomPropertyComparator 与 java.util.List 一起使用
- sql-server - SSRS 部署中的项目设置是什么?
- python - Discord 机器人检查机器人是否删除了消息