Intereting Posts
Меню параметров Android не отображается Android – удаление активности из вкуса GetSupportFragmentManager getFragment без тега или идентификатора Не удалось проверить приложение после обновления до Lollipop Как вызвать действие (принадлежащее модулю) в другом модуле на Android? Разница между onClickListener и onItemClickListener Как выпустить AAR с другой зависимостью проекта библиотеки Android? Авторизация Android Facebook – невозможно войти в систему, когда установлено официальное приложение Facebook Генерация клиента конечных точек приложения Appengine, не генерирующая файл jar источника Невозможно изменить валюту по умолчанию для выставления счетов в приложении Как очистить стек фрагмента Android без возобновления промежуточных фрагментов Невозможно отобразить Google+ SignInButton Как изменить текст на жирный шрифт в Android? Обработка видео с помощью GPUImage Android Получение динамически доступных языков приложения

Android Firebase обновляет только некоторые поля

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

Каждый раз, когда я обновляю этот узел, все остальные данные теряются.

Мой пользовательский класс

@IgnoreExtraProperties public class User { public String userID; public String userName; public String userMail; public boolean active; public User() {} public User(String userID, String userName) { this.userID = userID; this.userName = userName; } public User(String userID, String userName, String userMail, boolean active) { this.userID = userID; this.userName = userName; this.userMail = userMail; this.active = active; } @Exclude public Map<String, Object> toMap() { HashMap<String, Object> result = new HashMap<>(); result.put("user_id", userID); result.put("name", userName); result.put("email", userMail); result.put("active", active); return result; } } 

И мой код обновления:

 public class FireBaseUser { public static String FB_REFERENCE_USER = "user"; public void updateUser(String userID, String userName, String userMail, boolean userActive) { // Write a message to the database FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference(FB_REFERENCE_USER); User user = new User(userID, userName, userMail, userActive); Map<String, Object> postValues = user.toMap(); Map<String, Object> childUpdates = new HashMap<>(); childUpdates.put(userID, postValues); myRef.updateChildren(childUpdates); } } 

Когда я вызываю myRef.updateChildren(childUpdates); , Все мои старые данные обновляются, и мои новые дети (которые я создал во время приложения) теряются.

Введите описание изображения здесь

Ссылка, с которой выполняется обновление, относится к пути FB_REFERENCE_USER – который является путём, который содержит пользователей.

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

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

То есть вам нужно сделать что-то вроде этого:

 User user = new User(userID, userName, userMail, userActive); Map<String, Object> postValues = user.toMap(); myRef.child(userID).updateChildren(postValues); 

Поведение updateChildren описано здесь в документации.

Если вы хотите обновить только некоторое поле, попробуйте использовать

 myRef.child(userID).child("which field do you want to update").setValue(ValueVariable);