【问题标题】:Get parent of child in Firebase在 Firebase 中获取孩子的父母
【发布时间】:2021-11-09 00:20:35
【问题描述】:

我在从 Firebase 数据库中检索子密钥和父密钥时遇到问题。

我有一个如下所示的 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 部分,但这似乎是一个非常糟糕的做法。

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

    由于您循环遍历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)")
                })
            })
        })
    

    我可能在代码中遗漏了一些 null 处理,但我希望流程清晰。

    【讨论】:

    • 感谢您的浏览,我马上试试
    • 成功了,非常感谢,确实为我节省了很多时间。
    • 休息后才回来,这一切都太清楚了。好悲伤。
    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2013-06-04
    • 2018-01-29
    • 2019-05-02
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多