使用Android SDK的Firebase updateChildren()方法是否可以使用对象而不是JSON原始值?

3
我可以使用一个任意的(适用于Firebase)对象映射来使用updateChildren(),就像我可以使用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 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个回答

5

updateChildren()方法目前不接受任意Java对象。它只接受原始类型或原始类型的Map。

幸运的是,您可以使用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使用new ref.updateChildren()时出现IllegalStateException


非常感谢快速响应!顺便问一下,为什么不重载updateChildren()来接受对象并把theObjectMapper作为第一行呢? - chdryra
你有关于Firebase 9.x的更新推荐使用哪个映射器吗?我相信他们不再使用Jackson。 - Jeremy
从SD版本9.6开始,您可以将POJO传递给updateChildren()。但是如果您愿意,仍然可以自己使用Jackson。请参见https://dev59.com/r1oU5IYBdhLWcg3wV2C8#37548330。 - Frank van Puffelen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接