База данных Firebase setValue () и updateChildren () перезаписывают предыдущее значение - PullRequest
0 голосов
/ 08 октября 2018

Я пытался вставить новые данные в таблицу в базе данных реального времени Firebase, но setValue() и updateChildren() перезаписывают предыдущую таблицу и значение.

Я знаю, что setValue() заменяет предыдущуюданные, но в моем случае updateChildren() также перезаписывает предыдущие данные.

В Firebase console кажется, что оба метода delete предыдущей таблицы и создают новую таблицу.

Firebase console при выполнении updateChildren() enter image description here

Мой код неверен?

Моя структура базы данных:

enter image description here

-accounts
    - $userId
        - missions
            - $productId
                - ...

и код:

val missionsReference = FirebaseDatabase.getInstance().getReference("accounts").child(userId).child("missions")
val mission = Mission(product.id, product.imageUrl, product.title, product.logoUrl, remain.timeInMillis, "", -1, snsAddress)
missionsReference.child(product.id).setValue(mission)

val missionValue: Map<String, Any> = mission.toMap()
val missionUpdate: HashMap<String, Any> = HashMap()
missionUpdate[product.id] = missionValue
missionsReference.updateChildren(missionUpdate)
/* I also tried following methods, but it overwrites too.
FirebaseDatabase.getInstance().getReference("accounts/$userId/missions/${product.id}").setValue(mission)
missionsReference.push().setValue(mission)
*/

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

ОК, я отказался от создания массива миссий в таблице аккаунтов.и я попробовал как, и это работает.100

FirebaseDatabase.getInstance().reference.child("missions").child(id).setValue(mission)

Тем не менее я не знаю, почему этот метод работает, а предыдущие методы не работают.На мой взгляд, это похоже на проблему уровня базы данных (или глубины?)

Снимок экрана консоли Firebase.это работает ?

0 голосов
/ 08 октября 2018

Просматривая структуру вашей базы данных и предполагая, что вы должны достичь этого:

Firebase-root
   |
   --- accounts
         |
         --- userId
               |
               --- missions
                     |
                     --- 0
                     |   |
                     |   --- //Mission details
                     |
                     --- 4
                         |
                         --- //Mission details

Пожалуйста, используйте следующие строки кода:

val missionsReference = FirebaseDatabase.getInstance().reference.child("accounts").child(userId).child("missions")
val mission = Mission(product.id, product.imageUrl, product.title, product.logoUrl, remain.timeInMillis, "", -1, snsAddress)
missionsReference.child("4").setValue(mission)

Но вместо передачи жестко закодированного значения вФункция child(), я рекомендую использовать случайный ключ, сгенерированный функцией push() следующим образом:

missionsReference.push().setValue(mission)

Теперь ваша структура базы данных будет выглядеть следующим образом:

Firebase-root
   |
   --- accounts
         |
         --- userId
               |
               --- missions
                     |
                     --- randomId
                     |   |
                     |   --- //Mission details
                     |
                     --- randomId
                         |
                         --- //Mission details

В этом случае нет необходимости использовать функцию updateChildren().Эта функция используется для обновления свойств объекта Mission, например, если вы хотите изменить свойство `imageUrl``.

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