2016-03-25 13 views
1

Ich habe ein Problem mit ValueEvenListener auf Firebase. Betrachten Sie die Situation:Firebase updatechildren vs setvalue

Firebase ref = new Firebase(Constant.BASEURL).child("myLists"); 
ref.addValueEventListener(myValueEventListener); 

Dann versuche ich aktualisieren Sie eine der Listen Wert mit updateChildren().

HashMap<String, Object> newEditionTimeHM = new HasMap<String, Object> 
newEditionTimeHM.put("editionTimeStamp", ServerValue.TIMESTAMP); 

ref.child(pushKey).updateChildren(newEditionTimeHM); 

Es aktualisiert, aber wenn meine Zuhörer das Update fängt, stürzt „failed abprallen zu geben“ reporting Fehler.

Bei meinem zweiten Versuch erstelle ich ein neues shoppinList-Objekt mit den neuen Werten, die ich möchte, und schiebe es mit setValue().

Wenn meine Zuhörer es fängt, wird kein Problem gemeldet.

Was ist der Unterschied hier? Warum muss ich ein völlig neues Objekt erstellen, um den Hörer zu befriedigen? Ist es nicht effizienter, updateChildren() zu verwenden? Gesucht this page für die Antwort, aber nicht gefunden.

+0

Wenn es "nicht möglich ist, auf den Typ zu springen", dann sind die resultierenden Daten (onDataChange) in einem der Fälle wahrscheinlich anders als in anderen Fällen. Überprüfen Sie auf Debug, was ist der Unterschied und ziehen Sie Schlussfolgerungen. – Wukash

+0

@Wukash Ich überprüfte. Diese beiden Methoden sollten genau das Gleiche tun. Beweis dafür ist, dass wenn ich mein Firebase-Endergebnis überprüfe, das genau dasselbe mit der ersten Methode oder der Sekunde bekomme. Der Unterschied besteht darin, wie der Zuhörer reagiert. –

+0

Ja, ich verstehe, dass die Werte auf dem Server im Endergebnis gleich sind. Was ich gesagt habe, ist, dass Sie prüfen sollten, was der Unterschied in der Listener-Methode ist, und dementsprechend handeln. Ich meine, wir werden nicht in der Lage sein, das Verhalten der Firebase-Bibliothek zu ändern, also ist das deine einzige Option ... – Wukash

Antwort

2

ServerValue.TIMESTAMP hat der Typ Map<String, String>, also denke ich in Firebase Ihre Datenstruktur im Zusammenhang mit dieser, wenn Ihr pushKey ist "<your Firebase URL>/myLists":

"myLists": { 
    "editionTimeStamp": { 
     "timeStampKey": "timeStampValue" 
    } 
} 

Also, wenn Sie TIMESTAMP Wert erhalten möchten, schlage ich Ihre erste versuchen müssen:

ref.child("<your Firebase URL>/myLists/editionTimeStamp/timeStampKey"); 
ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
     String timeStampValue = (String)snapshot.getValue(); 
    } 
    @Override 
    public void onCancelled(FirebaseError firebaseError) { 
     System.out.println("The read failed: " + firebaseError.getMessage()); 
    } 
}); 

Wenn es nicht Ihre Lösung ist, ist hier eine gute Erklärung zu diesem Fehler: Why do I get "Failed to bounce to type" when I turn JSON from Firebase into Java objects?
es Hoffnung er lp: D

0

Ok. Ich habe das Problem gefunden. Ich realisierte das Lesen this page und die Antwort oben, dass ich missverstanden habe, wie Firebase Zuhörer arbeiten. Es gibt einen Unterschied bei der Reaktion auf setValue() und updateChildren(). Überprüfen Sie nach der Aktualisierung, welche Werte Sie benötigen, und verwenden Sie ChildEventListener oder ValueEventListener entsprechend. Das Leben ist wieder gut! Prost!

+0

danke @johny. Das werde ich mir merken. –