我在从Firebase数据库检索子密钥和父密钥时遇到了问题。
我有一个防火墙数据库,如下所示:
- friendlies
- 38UUDYtde4WF5AVcxcw6o9qaPBM2
- GYtQbt3KX1RveVeBAHd08u0Pdm42: true
- GYtQbt3KX1RveVeBAHd08u0Pdm42
- 38UUDYtde4WF5AVcxcw6o9qaPBM2: true我正在通过以下途径成功地获得这些数据:
var REF_FRIENDLIES = Database.database().reference().child("friendlies")
REF.FRIENDLIES.queryOrderedByKey().observeSingleEvent(of: .value, with: {
snapshot in
snapshot.children.forEach({
(snapChild) in
print("SnapChild: \(snapChild)")
let child = snapChild as! DataSnapshot
print("Child Key: \(child.key)")
print("Child Parent Key: \(child.ref.parent?.key)")
})
print("Snapshot: \(snapshot)")
})它的输出如下:
SnapChild: Snap (38UUDYtde4WF5AVcxcw6o9qaPBM2) {
GYtQbt3KX1RveVeBAHd08u0Pdm42 = 1;
}
Child Key: 38UUDYtde4WF5AVcxcw6o9qaPBM2
Child Parent Key: Optional("friendlies")
SnapChild: Snap (GYtQbt3KX1RveVeBAHd08u0Pdm42) {
38UUDYtde4WF5AVcxcw6o9qaPBM2 = 1;
}
Child Key: GYtQbt3KX1RveVeBAHd08u0Pdm42
Child Parent Key: Optional("friendlies")
Snapshot: Snap (friendlies) {
38UUDYtde4WF5AVcxcw6o9qaPBM2 = {
GYtQbt3KX1RveVeBAHd08u0Pdm42 = 1;
};
GYtQbt3KX1RveVeBAHd08u0Pdm42 = {
38UUDYtde4WF5AVcxcw6o9qaPBM2 = 1;
};
}子键正常工作;我遇到的问题是检索父数据。我想返回的是一个子ID,以及它的持有者/父数据。因此,我想将GYtQbt3KX1RveVeBAHd08u0Pdm42作为子键返回,而检索38UUDYtde4WF5AVcxcw6o9qaPBM2作为父键,但是作为父键返回的是friendlies。
快照清楚地包含了这一点,但是我不知道如何访问它。
编辑
因此,child.ref.description()将返回我想要的节点,但在我的数据库地址的末尾:
https://my-project.firebaseio.com/friendlies/38UUDYtde4WF5AVcxcw6o9qaPBM2和我只需替换字符串的url部分,但这似乎是一种非常糟糕的做法。
发布于 2021-09-13 18:28:08
由于您在snapshot.children上循环,父级的键始终是snapshot.key。
我认为您要做的是遍历friendlies下的两个子节点级别。但要做到这一点,您需要两个循环:
var REF_FRIENDLIES = Database.database().reference().child("friendlies")
REF.FRIENDLIES.queryOrderedByKey().observeSingleEvent(of: .value, with: {
snapshot in
snapshot.children.forEach({ (snapChild) in
let child = snapChild as! DataSnapshot
child.children.forEach({ (snapGrandchild) in
let grandchild = snapGrandchild as! DataSnapshot
print("Grandchild Key: \(grandchild.key)")
print("Grandchild Parent Key: \(child.key)")
})
})
})我可能在代码中遗漏了一些空处理,但我希望流程是清楚的。
https://stackoverflow.com/questions/69167221
复制相似问题