首页 文章

Firebase updateChildren()包含使用Android SDK的对象而不是JSON基元

提问于
浏览
1

我可以使用 updateChildren() 使用任意(Firebase友好)对象的 Map ,就像我可以使用 setValue() 一样吗?以下工作正常:

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

其中FbReview是一个简单的数据持有者类,带有一个空构造函数,并带有用于自动数据结构化的getter(使用 setValue() 中的对象显示在Firebase documentation for setValue()中)

但是,如果我尝试从网页上等效的 updateChildren() 后续示例:

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

我收到一个错误,表明我定义的FbReview对象无法解析:

FirebaseException:无法使用类... FbReview解析节点

如果我尝试上面的 updateChildren() 代码,但传递一个字符串( review.getSubject() 说)而不是一个对象,它工作得很好,表明对象解析不适用于 updateChildren() .

它是否正确?

1 回答

  • 4

    updateChildren() 方法当前不接受任意Java对象 . 它只接受原始类型或原始类型的映射 .

    幸运的是,您可以使用Jackson ObjectMapper轻松地将Java对象转换为相应的 Map :

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

    然后,您可以将值映射放入您传递给updateChildren()的值中:

    Map<String, Object> updatedReview = new HashMap<String, Object>();
    
    updates.put(REVIEWS_ROOT + "/" + review.getReviewId(), updatedReview);
    mDataRoot.updateChildren(updates, newAddListener(review, callback));
    

    也看到这个答案:Android Firebase 2.4 IllegalStateException using new ref.updateChildren()

相关问题