我在Firebase上遇到了valueEvenListener问题。考虑一下情况:
Firebase ref = new Firebase(Constant.BASEURL).child("myLists");
ref.addValueEventListener(myValueEventListener);
然后我尝试使用updateChildren()更新其中一个列表值。
HashMap<String, Object> newEditionTimeHM = new HasMap<String, Object>
newEditionTimeHM.put("editionTimeStamp", ServerValue.TIMESTAMP);
ref.child(pushKey).updateChildren(newEditionTimeHM);
它更新但是当我的听众收到更新时,它会崩溃报告&#34;未能反弹到键入&#34;错误。
在第二次尝试时,我使用我想要的新值创建一个新的shoppinList对象,并使用setValue()进行推送。
newEditionTimeHM.put("editionTimeStamp", ServerValue.TIMESTAMP);
ShoppingList shoppingList = new ShoppingList("Owner unknown", newEditionTimeHM);
ref.child(pushKey).setValue(shoppingList);
当我的听众发现它时,没有问题报告。
这有什么区别?为什么我需要创建一个全新的对象来满足监听器?使用updateChildren()不是更有效吗? 搜索了this page的答案,但未找到答案。
答案 0 :(得分:2)
ServerValue.TIMESTAMP
的类型为Map<String, String>
,因此,如果您的pushKey为"<your Firebase URL>/myLists"
,我猜您Firebase中的数据结构与此相关:
"myLists": {
"editionTimeStamp": {
"timeStampKey": "timeStampValue"
}
}
所以,如果你想获得TIMESTAMP
值,我建议你的第一次尝试必须是:
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());
}
});
如果不是您的解决方案,以下是对此错误的一个很好的解释:Why do I get "Failed to bounce to type" when I turn JSON from Firebase into Java objects?
希望它有所帮助:D
答案 1 :(得分:1)
确定。发现了问题。我意识到阅读this page和上面的答案,我误解了firebase听众的工作方式。对setValue()和updateChildren()的反应有所不同。确保在更新后检查所需的值,并相应地使用ChildEventListener或ValueEventListener。 生活再好!干杯!