Firebase值为null或空字符串时String与Long类型转换报错如何解决
Firebase Long与String类型转换错误修复方案
问题根因
实体类中meta字段声明为Long类型,但Firebase数据库中该字段存在空字符串""的存储值,Firebase Realtime Database自带的序列化工具无法自动将空字符串、普通字符串转换为Long类型,因此触发类型转换异常。
修复方案
方案一:兼容存量数据(推荐,无需修改数据库)
无需修改现有数据库中的存量数据,仅调整代码即可生效:
- 修改实体类
ModelAnhKhang的meta字段类型为String,新增类型转换方法处理空值、非法值:
public class ModelAnhKhang { private String id; private String tenhang; private String macuon; private String dvt; private String ngaynhap; private String phanloai; private Long somet; // 改为String类型匹配数据库存储格式 private String meta; private Double tytrong; // 新增转换方法,空值/非法值可自定义默认返回值 public Long getMetaAsLong() { if (meta == null || meta.trim().isEmpty()) { // 可根据业务需求调整为null或其他默认值 return 0L; } try { return Long.parseLong(meta); } catch (NumberFormatException e) { return 0L; } } // 原有getter、setter保留 public String getMeta() { return meta; } public void setMeta(String meta) { this.meta = meta; } }
- 修改Adapter中调用meta的逻辑,替换为转换方法:
// 将原有的modelAnhKhang.getMeta()替换为getMetaAsLong() holder.txtMetA.setText(String.valueOf(us.format(modelAnhKhang.getMetaAsLong())));
方案二:统一数据库字段类型
如果可批量修改数据库存量数据,可将所有meta字段的空字符串值统一修改为数值类型的0或null,保持该字段所有值均为Long类型,原有代码无需修改即可正常运行。
方案三:自定义反序列化规则
如果需要保持实体类meta字段为Long类型,可借助Firebase内部使用的Jackson序列化工具,添加自定义反序列化规则:
- 定义字符串转Long的自定义反序列化器:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; public class StringToLongDeserializer extends StdDeserializer<Long> { public StringToLongDeserializer() { super(Long.class); } @Override public Long deserialize(JsonParser p, DeserializationContext ctxt) { String value = p.getValueAsString(); if (value == null || value.trim().isEmpty()) { return 0L; } try { return Long.parseLong(value); } catch (NumberFormatException e) { return 0L; } } }
- 在实体类
meta字段上添加注解绑定反序列化器:
@JsonDeserialize(using = StringToLongDeserializer.class) private Long meta;
注意事项
- 如果业务中空值有特殊含义,可将默认返回值调整为
null,注意在Adapter调用时添加空判断避免空指针异常 - 后续向Firebase写入数据时,统一
meta字段的写入类型,避免混合存储字符串和Long类型值,从写入端规避类型不一致问题
内容的提问来源于stack exchange,提问作者Anh Cao
相关产品推荐
相关产品推荐

