2016-04-10 1 views
1

Kann ich updateChildren() mit einer Karte beliebiger (Firebase-freundlicher) Objekte auf die gleiche Weise wie setValue() verwenden? Die folgenden Werke fein:Firebase updateChildren() mit Objekten anstelle von JSON-Primitiven mit Android SDK

public void addReview(FbReview review, AddCallback callback) { 
    Firebase root = mDataRoot.child(REVIEWS_ROOT).child(review.getReviewId()); 
    root.setValue(review, newAddListener(review, callback)); 
} 

wo FbReview ist eine einfache Dateninhaber Klasse mit einem leeren Konstruktor und mit Getter für die automatische Datenstrukturierung (unter Verwendung von Objekten in setValue() im Firebase documentation for setValue()

jedoch angezeigt, wenn ich versuche, die Äquivalent updateChildren() Follow-on Beispiel von der Webseite:

@Override 
public void addReview(FbReview review, AddCallback callback) { 
    Map<String, Object> updates = new HashMap<>(); 
    updates.put(REVIEWS_ROOT + "/" + review.getReviewId(), review); 
    mDataRoot.updateChildren(updates, newAddListener(review, callback)); 
} 

ich einen Fehler, der die FbReview Objekt schlägt I definiert haben, können nicht analysiert werden:

FirebaseException: Fehler Knoten mit Klasse zu analysieren ... FbReview

Wenn ich versuche, die oben updateChildren() Code, sondern ein String übergeben (review.getSubject() sagen) eher als ein Objekt, um es funktioniert gut, das Objekt darauf hindeutet, doesn Parsen arbeite nicht mit updateChildren().

Ist das korrekt?

Antwort

3

Die Methode updateChildren() akzeptiert derzeit keine willkürlichen Java-Objekte. Es akzeptiert nur primitive Typen oder Maps primitiver Typen.

Zum Glück können Sie einfach mit Ihrem Java-Objekt an die entsprechende Karte ein Jackson ObjectMapper konvertieren:

Map<String, Object> userMap = new ObjectMapper().convertValue(user, Map.class); 

Dann können Sie die Karte von Werten in die Werte setzen, die Sie in updateChildren vorbei():

Map<String, Object> updatedReview = new HashMap<String, Object>(); 

updates.put(REVIEWS_ROOT + "/" + review.getReviewId(), updatedReview); 
mDataRoot.updateChildren(updates, newAddListener(review, callback)); 

diese Antwort Siehe auch: Android Firebase 2.4 IllegalStateException using new ref.updateChildren()

+0

Großen dank für die schnelle Antwort! Übrigens, warum nicht updateChildren() überladen, um Objekte zu akzeptieren und theObjectMapper als erste Zeile zu setzen? – chdryra

+0

Haben Sie eine aktualisierte Empfehlung, welcher Mapper für Firebase 9.x von Google verwendet werden soll? Ich glaube, sie verwenden nicht mehr Jackson –

+0

Ab SD Version 9.6 können Sie ein POJO an 'updateChildren()' übergeben. Aber Sie können Jackson auch immer noch selbst benutzen, wenn Sie wollen. Siehe http://stackoverflow.com/questions/37547399/how-to-deserialise-a-subclass-in-firebase-using-getvaluesubclass-class/37548330#37548330 –