2017-01-17 15 views
5

Pracuję nad aplikacją na Androida i za każdym razem, gdy użytkownik uruchamia tę aplikację, wygeneruje nowy rejestr (jeśli nie istnieje) od tego użytkownika, po aktualizacji istniejących danych i mojej aplikacji wstawi więcej informacji do węzła użytkownika.Aktualizacje Android Firebase tylko niektóre pola

Za każdym razem, gdy aktualizuję ten węzeł, wszystkie inne informacje są tracone.

Moja klasa użytkownik

@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; 
    } 

} 

A mój kod zmiana:

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

    } 
} 

Kiedy zadzwonić myRef.updateChildren(childUpdates);, wszystkie moje stare dane są aktualizowane i moje nowe dzieci (które stworzyłem w czasie aplikacji) są Stracony.

enter image description here

+0

cześć. Publikuj swoją strukturę bazy danych. –

+0

Witam, wysyłam obraz od momentu uruchomienia polecenia ** myRef.updateChildren (childUpdates); ** – rodrigo

Odpowiedz

6

Odniesienie z którą przeprowadzasz aktualizację jest na ścieżce FB_REFERENCE_USER - co wydaje się być droga, która zawiera użytkowników.

updateChildren aktualizuje tylko najbliższe dzieci, z wartościami pod tymi, które są zastępowane. Tak więc aktualizacja zastępuje całe dziecko dla użytkownika i pozostawia dzieci dla pozostałych użytkowników nietknięte. Takie jest oczekiwane zachowanie.

Należy wykonać aktualizację, korzystając z wartości ref dla tego konkretnego użytkownika - aby właściwości tego użytkownika, który nie jest aktualizowany, pozostały nietknięte.

Oznacza to, że trzeba zrobić coś takiego:

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

Zachowanie updateChildren opisano here w dokumentacji.

5

jeśli chcesz zaktualizować tylko niektóre pola, spróbuj użyć

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

Cześć, dziękuję, robię to i wszystko jest w porządku. Jednak staram się używać ** klasy ** dla "czystego" trybu. – rodrigo

+1

@rodrigo musisz dodać wszystkie dane potrzebne do twoich zajęć Użytkowników. –

+0

@ AldiRenaldiGunawan- To było idealne! Ale potrzebuję twojej pomocy ponownie. To było idealne, ponieważ od 8 feildów musiałem tylko zaktualizować 1 feild, a to naprawdę oszczędza czas wykonania. Jednak teraz muszę zaktualizować tylko 3 feampy z 8feilds? jakiejkolwiek sztuczce, aby zaktualizować go za pomocą mniejszego obiektu, który będzie zawierał tylko te 3 atrybuty? – user3833732

Powiązane problemy