Firebase updatechildren与setvalue

时间:2016-03-25 15:57:44

标签: android firebase setvalue

我在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的答案,但未找到答案。

2 个答案:

答案 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。 生活再好!干杯!