Firebase при добавлении потомка, другой ребенок удаляется - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь добавить ребенка к ребенку с именем: "users_want_notification".Кажется, это работает, но когда я пытаюсь добавить второго дочернего элемента с именем «users_want_notification» с другим именем, первый дочерний элемент будет удален.Как я могу изменить это, чтобы первый дочерний элемент не был удален?

Мой код:

Database.database().reference()
  .child("Notification").child("users").child(username)
  .setValue(["username": username, "url": Foto_url])
Database.database().reference()
  .child("Notification").child("users").child(username)
  .child("users_want_notification").child(Pro_user)
  .setValue(["Pro_user": Pro_user, "toDeviceID": AppDelegate.DEVICEID])

Firebase:

Firebase

1 Ответ

0 голосов
/ 28 сентября 2019

Когда вы вызываете setValue на дочернем узле, все существующие данные в этом узле заменяются значениями, которые вы передаете setValue.Если мы посмотрим на ваш первый вызов:

Database.database().reference()
  .child("Notification").child("users").child(username)
  .setValue(["username": username, "url": Foto_url])

Это заменит все существующие данные в /Notification/users/$username, включая все данные в его дочернем узле users_want_notification.Поскольку вы затем добавляете новый дочерний узел в users_want_notification, похоже, что этот вызов заменяет существующий дочерний узел, но на самом деле это первый setValue, который удаляет все данные.Вы можете проверить это, кратко закомментировав второй вызов, и вы увидите, что весь users_want_notification исчезает.

У вас есть два основных варианта:

  1. Использованиеотдельные setValue вызовы для отдельных свойств username и url:

    let userRef = Database.database().reference()
      .child("Notification").child("users").child(username)
    userRef.child("username").setValue(username)
    userRef.child("url").setValue(Foto_url])
    userRef.child("users_want_notification").child(Pro_user)
      .setValue(["Pro_user": Pro_user, "toDeviceID": AppDelegate.DEVICEID])
    

    Поскольку все setValue вызовы теперь происходят на уровнях ниже /Notification/users/$username, весь этот узел никогда не заменяется.

  2. Используйте один вызов updateChildNodes для всех данных, выполнив обновление для нескольких местоположений ( документы ).

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