2017-05-28 3 views
2

Während der Authentifizierung wird der Benutzer mit E-Mail und Benutzername erstellt. Jetzt versuche ich, diesen Benutzer mit neuen Feldern wie Vorname, Nachname, Adresse usw. zur Registrierungszeit zu aktualisieren. Aber wenn ich versuche, ein neues Feld einzufügen, wird es mit den neuen Feldern aktualisiert und die alten Felder werden entfernt.Wie update Kind mit neuen Feldern in Firebase Realtime-Datenbank?

public class User { 
     String uid,userName,firstName,lastName,email; 

     public User() { 
     } 
     //called on the time of auth 
     public User(String email, String userName) { 
      this.email = email; 
      this.userName = userName; 
     } 
     //called on registration process 
     public User(String firstName, String lastName,String mobileNo) { 
      this.firstName = firstName; 
      this.lastName = lastName; 
      this.mobileNo = mobileNo; 
     } 

     @Exclude 
     public Map<String, Object> toMap() { 
      HashMap<String, Object> result = new HashMap<>(); 
      result.put("email", email); 
      result.put("userName", userName); 
      result.put("firstName", firstName); 
      result.put("lastName", lastName); 
      return result; 
     } 

Die folgenden Methoden, um die Feuerbasis Datenbank hinzuzufügen und zu aktualisieren verwendet. Die addUser-Methode funktioniert ordnungsgemäß, ersetzt jedoch während der Aktualisierungsmethode die alten Daten.

String userId = getUid(); // its retrun firebase current user id as I use 
          // auth authentication  
//first time entry in database 
private void writeNewUser(String name, String email) { 
    User user = new User(name, email); 
    Map<String, Object> postValues = user.toMap(); 
    mDatabase.child("users").child(userId).setValue(postValues); 
} 
//Its called during the registration porecess 
private void updateUser() { 
     User user = new User(firstName, lastName, email); 
     Map<String, Object> postValues = user.toMap(); 
     mDatabase.child("users").child(userId).updateChildren(postValues); 
} 
+1

können Sie den Code anzeigen, in dem Sie die Datenbank aktualisieren? – faruk

+0

@faruk pls überprüfen Sie die Updates –

Antwort

1

ich glaube, die Lösung ist ganz einfach, nur um den alten Wert zuerst, vor der Aktualisierung, und ändern mit neuen Feldern oder neuen Wert, dann tun Sie das Update.

Um die oldValues ​​erhält ich weiß nicht, ob getValue(User.class) mit Fehlern zurückkehren wird oder nicht, so für die Sicherheit, die sie von den Kindern nur Schleife.

private void updateUser() { 
    mDatabase.child("users").child(userId) 
    .addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Map<String, Object> postValues = new HashMap<String,Object>(); 
      for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
      postValues.put(snapshot.getKey(),snapshot.getValue()); 
      } 
      postValues.put("email", email); 
      postValues.put("firstName", firstName); 
      postValues.put("lastName", lastName); 
      mDatabase.child("users").child(userId).updateChildren(postValues); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) {} 
     } 
    ); 
} 

Und auch der Konstruktor, die Sie für new User(String,String,String) ist für firstName, lastName, and mobileNo geschrieben hat, ist das Feld, das die email ist vielleicht weg?