Как переместить дочерний узел под другого ребенка? - PullRequest
0 голосов
/ 31 марта 2020

Я исследовал и попробовал некоторые предложения по переполнению стека, но код, похоже, не работает. Я пытался переместить узел, скопировав и затем удалив узел, но в конечном итоге все удаляется в firebase (исходная и скопированная запись).

Цель: переместить данные из-под дочернего элемента "в ожидании "to child" post "после нажатия пользователем кнопки.

Я хочу переместить ожидающую запись 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 голосов
/ 31 марта 2020

Если перед тем, как выполнить откат, вы заметили, что изменение было выполнено на короткое время, чаще всего это происходит из-за наличия правила безопасности , которое отклоняет изменение.

В этом случае клиент сначала запускает локальные события для изменения, а затем отправляет изменение на сервер. Затем, когда он слышит от сервера, что изменение было отклонено, он запускает локальные события, чтобы снова получить правильное состояние.

Так что в вашем случае вам разрешено удалить узел из 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)
})

С этим кодом и запись нового узла, и удаление старого узла отправляются в базу данных как одна операция, поэтому также принимаются или отклоняются вашей безопасностью правила как единое целое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...