如何解决访问Firebase数据库中的多个节点
我很难从Firebase数据库中的一个节点中提取所有数据。
以下是该节点在Firebase中的外观:
Considerations
-MEdUNZwVrsDW3dTrE6N
Company Description:
Company Image:
Company Name:
Decision Date:
Start Date:
Users
B2Z4DlZ8RucvEQhz2NSUkquqc5P2
Compensation:
PostNumber:
StoryNumber:
在用户下,将会有多个人的补偿,职位号和故事号具有不同的值。我让每个用户都有一个名为“用户注意事项”的节点,该节点标记每个用户附加的注意事项的唯一ID,并将其放在其UID下,并将其旁边的1标记为值。我正在尝试访问每个特定用户的信息以及节点中的其他信息。这是我用来调用信息的代码以及用来捕获信息的结构:
结构:
import UIKit
class ConsiderationInfo: NSObject {
var companyName: String?
var companyImage: String?
var companyDescription: String?
var decisionDate: String?
var startDate: String?
var compensation: String?
var postNumber: String?
var storyNumber: String?
}
用于查看信息的代码:
func updateConsiderationsArray() {
let uid = Auth.auth().currentUser?.uid
let ref = Database.database().reference().child("user-considerations").child(uid!)
ref.observe(.childAdded,with: { (snapshot) in
let considerationId = snapshot.key
let considerationReference = Database.database().reference().child("Considerations").child(considerationId)
considerationReference.observe(.value,with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let considerationInfo = ConsiderationInfo()
//self.setValuesForKeys(dictionary)
considerationInfo.companyName = dictionary["Company Name"] as? String
considerationInfo.companyImage = dictionary["Company Image"] as? String
considerationInfo.companyDescription = dictionary["Company Description"] as? String
considerationInfo.decisionDate = dictionary["Decision Date"] as? String
considerationInfo.startDate = dictionary["Start Date"] as? String
self.considerationsInfo.append(considerationInfo)
self.considerationName.append(considerationInfo.companyName!)
self.filteredConsiderations.append(considerationInfo.companyName!)
self.considerationCollectionView.reloadData()
}
},withCancel: nil)
})
}
我正在尝试访问用户特定节点下的信息,即特定用户的补偿职位编号和故事编号。我不知道如何访问所有这些内容以附加该结构。
这是具有用户注意事项的节点:
解决方法
就目前而言,我确实没有看到任何超级错误的代码,但是有几件事可以更改以使其更加简化。
我将首先更改“注意事项”类以使其更加独立。添加便捷初始化程序以通过一些错误检查直接处理Firebase快照。
class ConsiderationInfo: NSObject {
var companyName = ""
convenience init(withSnapshot: DataSnapshot) {
self.init()
self.companyName = withSnapshot.childSnapshot(forPath: "Company Name").value as? String ?? "No Company Name"
}
}
我还建议删除.childAdded和.observe事件,除非您特别希望将来发生更改时收到通知。请改用.value和.observeSingleEvent。请记住,.childAdded一次遍历数据库中的每个节点-.value一次读取所有节点。如果数据量有限,.value效果很好。
func updateConsiderationsArray() {
let fbRef = Database.database().reference()
let uid = Auth.auth().currentUser?.uid
let ref = fbRef.child("user_considerations").child(uid)
ref.observeSingleEvent(of: .value,with: { snapshot in
let allUidsSnap = snapshot.children.allObjects as! [DataSnapshot]
for uidSnap in allUidsSnap {
let considerationId = uidSnap.key
let considerationReference = fbRef.child("Considerations").child(considerationId)
considerationReference.observeSingleEvent(of: .value,with: { snapshot in
let considerationInfo = ConsiderationInfo(withSnapshot: snapshot)
self.considerationArray.append(considerationInfo)
// update your collectionView
})
}
})
}
我在上面所做的是从user_considerations中读取单个节点,根据您的要求,它看起来像这样
user_considerations
some_user_uid
a_user_uid
a_user_uid
然后将每个子用户映射到一个数组以维持顺序
let allUidsSnap = snapshot.children.allObjects as! [DataSnapshot]
,然后遍历每个节点,获取每个节点的uid(键),然后从“注意事项”节点获取该节点的数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。