Обновление нескольких полей в нескольких узлах одновременно в Firebase (Android) - PullRequest
0 голосов
/ 15 мая 2019

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

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

Я звоню изнутри кнопки viewholder.button (в адаптере представления переработчика)

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);

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Я пытаюсь обновить несколько полей в разных узлах, используя Карты и Обновить дочерние элементы, однако firebase удаляет данные в соответствующих узлах и добавляет данные.

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

Установите данные в этом месте на заданное значение.

Идем вперед,

Я хочу, чтобы данные были обновлены, а предыдущие данные остались прежними.

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

Обновите определенные дочерние ключи до указанных значений.

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

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

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

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

0 голосов
/ 19 мая 2019

Следующее решение работает на основе предложения @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);

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

0 голосов
/ 15 мая 2019

Привет, вы можете использовать метод 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

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