You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase值为null或空字符串时String与Long类型转换报错如何解决

Firebase Long与String类型转换错误修复方案

问题根因

实体类中meta字段声明为Long类型,但Firebase数据库中该字段存在空字符串""的存储值,Firebase Realtime Database自带的序列化工具无法自动将空字符串、普通字符串转换为Long类型,因此触发类型转换异常。

修复方案

方案一:兼容存量数据(推荐,无需修改数据库)

无需修改现有数据库中的存量数据,仅调整代码即可生效:

  1. 修改实体类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;
     }
}
  1. 修改Adapter中调用meta的逻辑,替换为转换方法:
// 将原有的modelAnhKhang.getMeta()替换为getMetaAsLong()
holder.txtMetA.setText(String.valueOf(us.format(modelAnhKhang.getMetaAsLong())));

方案二:统一数据库字段类型

如果可批量修改数据库存量数据,可将所有meta字段的空字符串值统一修改为数值类型的0或null,保持该字段所有值均为Long类型,原有代码无需修改即可正常运行。

方案三:自定义反序列化规则

如果需要保持实体类meta字段为Long类型,可借助Firebase内部使用的Jackson序列化工具,添加自定义反序列化规则:

  1. 定义字符串转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;
        }
    }
}
  1. 在实体类meta字段上添加注解绑定反序列化器:
@JsonDeserialize(using = StringToLongDeserializer.class)
private Long meta;

注意事项

  • 如果业务中空值有特殊含义,可将默认返回值调整为null,注意在Adapter调用时添加空判断避免空指针异常
  • 后续向Firebase写入数据时,统一meta字段的写入类型,避免混合存储字符串和Long类型值,从写入端规避类型不一致问题

内容的提问来源于stack exchange,提问作者Anh Cao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:18:01