如何将子节点的引用添加到另一个节点?

时间:2017-05-24 02:15:23

标签: ios swift firebase firebase-realtime-database

请考虑以下格式:

{
    "events": {
        "one": { ... }
        "two": { ... }
        ...
    }

    "user-events": {
        "foo": {
            "one": true
        }
    }

    "users": {
        "foo": { ... }
    }
}

假设我不知道节点"two"的名称并且它实际上是一些随机字符串,在Firebase中,如何在"two": true中将"foo"添加到"user-events"事件"two"完成后?当我创建"two"时,我应该在数据库中的某处保存其生成的ID(实际上不是“两个”)吗?

我问,因为我在Swift应用程序中有一个包含来自"events"的所有事件的提要,并且每个事件单元都有一个按钮,该按钮应该将事件添加到登录用户的配置文件中。在"user-events"下的该用户ID(在本例中为“foo”)下,我想添加一个被点击的事件的引用。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你可以尝试这样做:

1)通过.childByAutoId() func生成unicId并将其保存到您的项目中。例如,它将是post

2)使用此unicId进行保存。

static func add(_ postItem: PostItem,
                   completion: @escaping (_ hasFinished: Bool) -> Void) {
    let mainReference = FIRDatabase.database().reference(withPath: "MainDataBase")

    let updates = [
         "/spotpost/" + postItem.key: postItem.toAnyObject(),
         "/spots/" + postItem.spotId + "/posts/" + postItem.key: true,
         "/users/" + postItem.addedByUser + "/posts/" + postItem.key: true
    ]

    mainReference.updateChildValues(updates) 
    { (error, _) in
        if error == nil {
           completion(true)
        } else {
           completion(false)
        }
    }
}

您可以同时将其添加到多个地方。

或者如果您想在之后的某个时间添加它 - 您需要将此密钥存储在对象中。像:

+SomeObject
    -key
    -property1
    -...
    -propertyN

然后使用它。

希望有所帮助