2017-10-05 5 views
2

Ich versuche DataSnapshot-Wert in Objekt zu konvertieren. Es funktioniert gut, ich glaube, dass Bean-Konstruktor (mit Argumenten) für die Konvertierung verwendet. Ich habe einige Codezeilen hinzugefügt, um einige Operationen auszuführen, aber Codezeilen, die ich hinzugefügt habe, werden nie ausgeführt. Probe-Bean-Klasse:Firebase Echtzeitdatenbank DataSnapshot-Wert zu Objektkonvertierung

@IgnoreExtraProperties 
public class DatabaseRecord { 

    private String firstName; 
    private String lastName; 
    private String fullName; 

    private DatabaseRecord() { 
    } 

    public DatabaseRecord(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     // following code not executing 
     this.fullName = firstName + lastName; 
    } 

    public String getFirstName() { return firstName; } 
    public String getLastName() { return lastName; } 
    public String getFullName() { return fullName; } 
} 

Firebase Online-Datenbank Fluss: enter image description here

Datenabruf Ausführungscode:

DatabaseReference databaseReference = database.getReference("/user/user1"); 
databaseReference.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     DatabaseRecord record = dataSnapshot.getValue(DatabaseRecord.class); 
     Log.d(TAG, record.getFirstName()+":"+record.getLastName()+":"+record.getFullName()); 
    } 

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

Ausgang:

Satish: Pandey: null

  1. Google Dokumentation zeigt parametrisierten Konstruktor zum Festlegen von Eigenschaften, wenn das der Fall ist, warum nicht mein Code ausgeführt wird?

  2. Wie kann ich meinen Code anhängen, nachdem die Google-Konvertierung im selben Bean-Objekt abgeschlossen ist?

Antwort

1

In Ihrem Fall der Konstruktor, der aufgerufen wird, ist die parameterlos da Sie aus der Datenbank lesen getValue() verwenden, die die Werte in der zur Karte erforderlich ist DataSnapshot. Gemäß dem Dokument, das sind die Regeln, die Sie folgen müssen die DataSnapshot Daten in einer benutzerdefinierten Java-Klasse zu erhalten:

  • Die Klasse muss einen Standardkonstruktor haben, die

  • Die Klasse ohne Argumente muss öffentliche Getter für die Eigenschaften definieren, die zugewiesen werden sollen. Eigenschaften ohne öffentlichen Getter werden auf ihren Standardwert gesetzt, wenn eine Instanz deserialisiert wird.

Ich möchte Sie den Wert für die Eigenschaft festlegen fullName Sie es in der gleichen getFullName() Methode tun können. Beispiel:

2

firebaser hier

Die Firebase JSON Deserializer verwendet den Standard (parameter) Konstruktor und verwendet dann entweder Setter-Methoden oder öffentliche Felder für die Werte einstellen.

Die meisten Beispiele (und der meiste reale Code, den ich schreibe) haben einen parametrisierten Konstruktor für die regelmäßige Erstellung der Objekte, aber dieser parametrisierte Konstruktor wird nicht von Firebase verwendet.

Ich würde wahrscheinlich getFullName() einen berechneten Wert machen:

public String getFullName() { return firstName + lastName; } 
+0

Ich habe private Zugriffsmodifizierer an Eigenschaften und Standardkonstruktor angefügt und habe keine Setter-Methoden in meiner Bean-Klasse, aber Firebase füllt Werte für firstName und lastName. –

+0

Wenn kein Setter vorhanden ist, versucht Firebase, ein Feld zu finden, das der JSON-Eigenschaft entspricht, und legt den Wert direkt dort fest. –

Verwandte Themen