Firebase updatechildren 与 setvalue

Firebase updatechildren vs 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);

它会更新,但是当我的侦听器捕获到更新时,它会崩溃并报告 "failed to bounce to type" 错误。

第二次尝试时,我使用我想要的新值创建了一个新的 shoppinList 对象,并使用 setValue() 推送它。

newEditionTimeHM.put("editionTimeStamp", ServerValue.TIMESTAMP);
ShoppingList shoppingList = new ShoppingList("Owner unknown", newEditionTimeHM);

ref.child(pushKey).setValue(shoppingList);

当我的听众听到它时,没有报告任何问题。

这里有什么区别?为什么我需要创建一个全新的对象来满足听众?使用updateChildren()不是更高效吗? 已搜索 this page 答案但未找到。

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());
    }
});

如果这不是您的解决方案,这里有一个关于此错误的很好的解释:
希望对你有帮助:D

好的。发现了问题。我意识到阅读 this page 和上面的答案我误解了 firebase 侦听器的工作方式。对 setValue() 和 updateChildren() 的反应有所不同。确保在更新后检查您需要的值,并相应地使用 ChildEventListener 或 ValueEventListener。 生活又美好了!干杯!