Одновременное обновление нескольких полей в нескольких узлах в Firebase (Android)

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

Я не пытаюсь создавать новые поля, а просто одновременно обновляю 2 существующих поля в 2 разных узлах. У каждого узла есть 10 разных полей, которые я хочу сохранить.

Я вызываю это изнутри viewholder.button (в адаптере представления recycler)

String ref1 = "users/" + currentUserId;
String ref2 = "user_detail_profile/" + currentUserId;

HashMap<String, Object> updateFbDb1 = new HashMap<>();
updateFbDb1.put("name", "Albert Einstein");
updateFbDb1.put("score", 23);

HashMap<String, Object> updateFbDb2 = new HashMap<>();
updateFbDb2.put("claps", 55);
updateFbDb2.put("comments", 21);

HashMap<String, Object> updateFbDb3 = new HashMap<>();

updateFbDb3.put(ref1, updateFbDb1);
updateFbDb3.put(ref2, updateFbDb2);

fbDbRefRoot.updateChildren(updateFbDb3);

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

HashMap<String, Object> updateFbDb1 = new HashMap<>();
updateFbDb1.put("name", "Albert Einstein");
updateFbDb1.put("score", 23);

HashMap<String, Object> updateFbDb2 = new HashMap<>();
updateFbDb2.put("claps", 55);
updateFbDb2.put("comments", 21);

fbDbRefRoot.child("users").child(currentUserId).updateChildren(updateFbDb1);
fbDbRefRoot.child("user_detail_profile").child(currentUserId).updateChildren(updateFbDb2);

вы используете базу данных в реальном времени или firestore?

Hello world 15.05.2019 07:17

база данных реального времени

DragonFire 15.05.2019 07:18

отлично, позвольте мне помочь вам с моим ответом. вы должны использовать метод push firebase для добавления новых данных

Hello world 15.05.2019 07:19

это не новые данные, это просто обновление некоторых полей

DragonFire 15.05.2019 07:20

правильно правильно я думал ты хочешь новый ряд

Hello world 15.05.2019 07:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
5
2 019
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Эй, вы можете использовать метод push при добавлении данных в узел firebase

Вот как вы создаете экземпляр

    private lateinit var database: DatabaseReference
    // ...
    database = FirebaseDatabase.getInstance().reference

Вот как вы просто добавляете данные

    mDatabase.child("users").child(userId).child("username").setValue(name);

И вот как вы отправляете данные

    String key = mDatabase.child("posts").push().getKey();
    Post post = new Post(userId, username, title, body);
    Map<String, Object> postValues = post.toMap();

    Map<String, Object> childUpdates = new HashMap<>();
    childUpdates.put("/posts/" + key, postValues);
    childUpdates.put("/user-posts/" + userId + "/" + key, postValues);

    mDatabase.updateChildren(childUpdates);

Также, если вы хотите обновить определенные файлы

Вот ссылка

https://firebase.google.com/docs/database/android/read-and-write#update_specific_fields

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

DragonFire 15.05.2019 07:28

I am trying to update multiple fields in different nodes using Maps and Update children however firebase is deleting the data in the respective nodes and adding the data.

Это происходит, когда вы используете setValue (значение объекта) DatabaseReference:

Set the data at this location to the given value.

Идти вперед,

I want the data to be updated and previous data to remain the same.

В этом случае вы должны использовать updateChildren (обновление карты) DatabaseReference, я вижу, вы уже используете его в своем коде.

Update the specific child keys to the specified values.

Идя еще дальше,

This is working but I would like to do it in one shot so a success listener can be attached on all or none basis.

В этом случае вы должны использовать пакетные операции, как объяснено в моем ответе из следующего поста:

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

Привет, Алекс, я благодарен за время, которое вы потратили, чтобы дать ответ, но можно ли дать какой-нибудь рабочий код, чтобы показать, что работает. Теоретически первый код в моем вопросе должен работать, но он не работает.

DragonFire 18.05.2019 01:12

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

DragonFire 19.05.2019 00:24

Я не могу кодировать для вас. Вообще говоря, вы должны сделать свою собственную попытку, учитывая информацию в ответе, и задать другой вопрос, если возникнет что-то еще. Кроме того, ваш ответ является точным дубликат решения, которое указано в моем ответе выше, и я добавил его специально, чтобы помочь вам. Итак, что вы сделали, это скопировали мой ответ и поместили его в свой ответ. Надеюсь, вы сделаете это правильно :)

Alex Mamo 20.05.2019 10:09

Привет, Алекс, твой ответ похож, но не точен. Мой случай включает два поля в каждом узле. У вас есть только одно поле в каждом узле. Во-вторых, я сделал попытку, пытаясь добавить карты внутри карт. Мой ответ продемонстрирует, что это не работает, и правильный подход — сделать одну большую карту. Это поможет многим другим пользователям так, как ваш ответ не поможет. Я мог бы просто ничего не публиковать, потому что я не получаю баллов, отмечая свой собственный ответ как правильный. Цель состоит в том, чтобы вернуть что-то в stackoverflow после получения так много.

DragonFire 20.05.2019 12:04

PS Я отдал вам должное в своем ответе ниже, и я благодарен вам за помощь.

DragonFire 20.05.2019 12:05

@DragonFire Почти невозможно найти идеальное соответствие между ответами. Да, это похоже, и поэтому похожие ответы обычно помечаются как дубликаты. Когда кто-то показывает вам пример, вы наверняка не найдете одинаковые имена или номера для свойств, идея и решение должны быть одинаковыми, но вам решать, какой ответ правильный.

Alex Mamo 20.05.2019 12:19
Ответ принят как подходящий

Следующее решение работает на основе предложения @Alex Mamos работает...

Map<String, Object> map = new HashMap<>();
map.put("/users/" + currentUserId + "/name/", "Albert Einstein");
map.put("/users/" + currentUserId + "/score/", 23);
map.put("/user_detail_profile/" + currentUserId + "/claps/", 45);
map.put("/user_detail_profile/" + currentUserId + "/comments/", 8);
fbDbRefRoot.updateChildren(map);

Почему-то не работает вставка карт внутрь карт. Все это должно быть частью большой карты.

теперь можно добавить прослушиватель успеха, и он будет обновляться как пакет.

DragonFire 19.05.2019 00:13

это работает для меня. Спасибо Алексу и DragonFire

Ujjwal Jung Thapa 02.08.2019 04:19

Другие вопросы по теме