如何将一个子节点移到另一个子节点下?

时间:2020-03-31 03:13:56

标签: swift firebase-realtime-database

我已经研究并尝试了一些有关堆栈溢出的建议,但是代码似乎无法正常工作。我一直在尝试通过复制然后删除该节点来移动节点,但最终所有内容都在firebase中被删除(原始和复制后的帖子)。

目标:用户按下按钮后,将数据从“待处理”子项下移至“发布”子项。

我想将Shelly A.待处理帖子移到帖子下。

Firebase数据库:

-pending
  -childByAutoId()
    -name: Shelly A.
    -post: "Haha"

-posts
  -childByAutoId()
    -name: Josh A.
    -post: "funny"

代码

ref = Database.database().reference()

//copying the node from the child "pending" to child "posts"
self.ref.child("pending").child(event.id!).observe(.value, with: { (snapshot) in
                self.ref.child("posts").child(event.id!).setValue(snapshot.value)

            })
        //deleting the original posts
            self.ref.child("pending").child(event.id!).setValue(nil)

看着数据库,我能够复制数据,但是很快,新复制的数据被旧帖子完全删除了。有帮助吗?

1 个答案:

答案 0 :(得分:0)

如果您看到在回滚之前短暂进行了更改,则最常见的情况是发生这种情况,因为您有一个security rule拒绝更改。

在这种情况下,客户端首先触发更改的本地事件,然后将更改发送到服务器。然后,当它从服务器上听到更改被拒绝的消息时,它将触发本地事件以再次使状态正确。

因此,在您看来,您被允许pending删除节点,但不允许在posts下添加数据。


防止这种部分操作的好方法是在单个多位置更新操作中同时包含删除和写入操作。

ref = Database.database().reference()

self.ref.child("pending").child(event.id!).observe(.value, with: { (snapshot) in
    var updates = [
        "posts/\(event.id!)": snapshot.value,
        "pending/\(event.id!)": nil
    ]
    self.ref. updateChildValues(updates)
})

使用此代码,将新节点的写入和删除旧节点作为一个操作发送到数据库,因此也将安全规则作为一个操作被接受或拒绝。