Firebase Android中getValue(Class)无法映射数据问题排查
问题解决思路与修正方案
首先先回答你的疑问:关于需要同时提供getter和setter的说法是完全正确的。Firebase Realtime Database在将JSON数据映射为Java对象时,要求目标类必须具备:
- 一个无参构造函数(你的类已经实现了)
- 对应每个字段的getter和setter方法(或者将字段设为public,但使用getter/setter是更符合Java规范的实践)
你的UserBanknoteAmountBindModel已经满足这些要求,这部分没有问题。
核心问题:循环中误用了数据源
你代码里的关键错误出在循环逻辑上:你遍历的是dataSnapshot.getChildren()返回的每个子节点(存在banknoteAmount变量里),但调用getValue()时却用了外层的dataSnapshot,而不是当前循环的子节点变量!这就导致你一直在尝试解析整个父节点的数据,而非每个子节点的内容,自然无法正确映射到你的实体类。
修正后的代码
把循环内的解析代码改成这样:
for (DataSnapshot banknoteAmount : dataSnapshot.getChildren()) { // 注意这里用的是循环变量banknoteAmount,而非外层的dataSnapshot UserBanknoteAmountBindModel userBanknoteAmountBindModel = banknoteAmount.getValue(UserBanknoteAmountBindModel.class); // 打印验证映射结果 Log.wtf("ParsedModel", "userId: " + userBanknoteAmountBindModel.getUserId() + ", banknoteType: " + userBanknoteAmountBindModel.getBanknoteType() + ", amount: " + userBanknoteAmountBindModel.getBanknoteAmount()); }
额外说明
从你提供的日志内容:
{banknoteAmount=3, banknoteType=20_dollar, userId=112371098270685247195}
来看,子节点的字段名和你实体类的字段名完全匹配,所以修正数据源后,映射应该就能正常工作了。
内容的提问来源于stack exchange,提问作者joy
相关产品推荐
相关产品推荐

