从Firebase获取数据至自定义类时抛出DatabaseException异常求助
这个错误我之前也碰到过,本质是Firebase尝试把数据库里的一个Long类型值映射到你的CodeDescMast对象时类型不匹配,大概率是你的读取路径不对,或者数据库里对应节点的数据结构和POJO不匹配。下面给你一步步排查和解决的方法:
先确认读取的数据库路径是否正确
很多时候出错是因为误读了某个子字段的数值,而不是整个CodeDescMast对象的节点。比如你本来要读/codeDescs/{itemId}这个完整对象节点,但不小心写成了/codeDescs/{itemId}/id(这个节点是Long类型),自然转不成对象。先核对你的dSnpSht对应的数据库路径,确保指向的是完整的CodeDescMast对象节点。打印调试当前节点的实际数据
在报错的代码前加一段调试代码,看看你拿到的到底是什么:Object rawValue = dSnpSht.getValue(); Log.d("FirebaseDebug", "当前节点值类型: " + rawValue.getClass().getName() + ", 内容: " + rawValue);运行后看日志,如果输出是
java.lang.Long,那说明你确实读错了路径,或者数据库里这个节点存的就是个数字,不是对象。核对数据库数据结构和POJO的匹配度
- 检查Firebase控制台里对应节点的数据:确保它是一个键值对对象,而不是单个数值。比如正确的结构应该是像这样的键值对:
如果这个节点下直接是一个数字(比如{ "code": "CODE001", "desc": "测试描述", "id": 1 }1),那就是数据存错了,需要在控制台修正。 - 确认POJO字段和数据库键名完全一致(大小写敏感):比如数据库里是
code,POJO里不能写成Code或者CODE;getter/setter要符合JavaBean规范,比如字段id的getter是getId(),setter是setId(int id),不能乱命名。
- 检查Firebase控制台里对应节点的数据:确保它是一个键值对对象,而不是单个数值。比如正确的结构应该是像这样的键值对:
检查POJO的int字段处理
Firebase会把Java的int存储为Long类型,但它本身支持自动转换,只要你的POJO字段是int且getter/setter正确,这个不会导致报错。但如果数据库里某个字段是Long,而你POJO里对应的是String,那会触发类型错误,这点也要注意排查。修复错误的数据库数据
如果是之前存数据时误操作,把Long值存到了本该放CodeDescMast对象的节点下,直接在Firebase控制台删除这个错误节点,重新存入正确的对象结构即可。
按照上面的步骤排查,基本就能定位到问题所在了。
内容的提问来源于stack exchange,提问作者megjosh

