Я пытаюсь обновить несколько полей в разных узлах, используя дочерние карты и обновления, однако 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);
база данных реального времени
отлично, позвольте мне помочь вам с моим ответом. вы должны использовать метод push firebase для добавления новых данных
это не новые данные, это просто обновление некоторых полей
правильно правильно я думал ты хочешь новый ряд




Эй, вы можете использовать метод 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 разных узлах одновременно, я могу сделать это, используя вложенное обновление, но это длинная процедура...
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.
В этом случае вы должны использовать пакетные операции, как объяснено в моем ответе из следующего поста:
Теперь вы можете добавить полный прослушиватель или прослушиватель успеха к пакетной операции. Также обратите внимание, что это атомарная операция, что означает, что либо все операции выполняются успешно, либо ни одна из них не применяется.
Привет, Алекс, я благодарен за время, которое вы потратили, чтобы дать ответ, но можно ли дать какой-нибудь рабочий код, чтобы показать, что работает. Теоретически первый код в моем вопросе должен работать, но он не работает.
пожалуйста, посмотрите мой ответ, кажется, что обновление дочерних элементов работает, когда все узлы вводятся в карту как одну большую карту, а не карты внутри карт ... это жутко.
Я не могу кодировать для вас. Вообще говоря, вы должны сделать свою собственную попытку, учитывая информацию в ответе, и задать другой вопрос, если возникнет что-то еще. Кроме того, ваш ответ является точным дубликат решения, которое указано в моем ответе выше, и я добавил его специально, чтобы помочь вам. Итак, что вы сделали, это скопировали мой ответ и поместили его в свой ответ. Надеюсь, вы сделаете это правильно :)
Привет, Алекс, твой ответ похож, но не точен. Мой случай включает два поля в каждом узле. У вас есть только одно поле в каждом узле. Во-вторых, я сделал попытку, пытаясь добавить карты внутри карт. Мой ответ продемонстрирует, что это не работает, и правильный подход — сделать одну большую карту. Это поможет многим другим пользователям так, как ваш ответ не поможет. Я мог бы просто ничего не публиковать, потому что я не получаю баллов, отмечая свой собственный ответ как правильный. Цель состоит в том, чтобы вернуть что-то в stackoverflow после получения так много.
PS Я отдал вам должное в своем ответе ниже, и я благодарен вам за помощь.
@DragonFire Почти невозможно найти идеальное соответствие между ответами. Да, это похоже, и поэтому похожие ответы обычно помечаются как дубликаты. Когда кто-то показывает вам пример, вы наверняка не найдете одинаковые имена или номера для свойств, идея и решение должны быть одинаковыми, но вам решать, какой ответ правильный.
Следующее решение работает на основе предложения @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
вы используете базу данных в реальном времени или firestore?