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

Firebase存储字段自动添加前缀下划线问题咨询

问题原因与解决办法

原因

Firebase Realtime Database 对 Java 对象序列化时,默认遵循JavaBean 规范:它会通过 getter 方法的名称推断字段名。你的 getter 方法命名是get_location_id(),Firebase 会直接把get_后面的部分作为字段名,最终存储成_location_id这类带前缀下划线的格式。

另外你的代码里有个明显笔误:构造函数里引用了category_id,但类里并没有定义这个字段,建议先修正,避免后续出现其他异常。


解决办法(两种可选)

方法1:修正getter/setter为JavaBean规范命名

把getter/setter改成标准驼峰命名格式,Firebase会自动将驼峰格式转成下划线分隔的字段名(比如getLocation_id()对应Firebase里的location_id):

public class PoIs {
    private Integer location_id;
    private String location_name;
    private String location_address;
    
    public PoIs() {}

    // 修正构造函数的category_id笔误
    public PoIs(Integer location_id, String location_name, String location_address) {
        this();
        this.location_id = location_id;
        this.location_name = location_name;
        this.location_address = location_address;
    }

    // 标准JavaBean风格的getter/setter
    public Integer getLocation_id() {
        return location_id;
    }

    public void setLocation_id(Integer location_id) {
        this.location_id = location_id;
    }

    public String getLocation_name() {
        return location_name;
    }

    public void setLocation_name(String location_name) {
        this.location_name = location_name;
    }

    public String getLocation_address() {
        return location_address;
    }

    public void setLocation_address(String location_address) {
        this.location_address = location_address;
    }
}

如果愿意,也可以把字段名改成驼峰格式(比如locationId),配合getLocationId()的getter,Firebase会直接存储驼峰字段名,按需选择即可。

方法2:使用@PropertyName注解强制指定字段名

如果不想修改现有getter/setter的命名,可以用Firebase提供的@PropertyName注解,直接指定字段在Firebase中的存储名称:

import com.google.firebase.database.PropertyName;

public class PoIs {
    private Integer location_id;
    private String location_name;
    private String location_address;
    
    public PoIs() {}

    // 修正构造函数笔误
    public PoIs(Integer location_id, String location_name, String location_address) {
        this();
        this.location_id = location_id;
        this.location_name = location_name;
        this.location_address = location_address;
    }

    @PropertyName("location_id")
    public Integer get_location_id() {
        return location_id;
    }

    @PropertyName("location_id")
    public void set_location_id(Integer location_id) {
        this.location_id = location_id;
    }

    @PropertyName("location_name")
    public String get_location_name() {
        return location_name;
    }

    @PropertyName("location_name")
    public void set_location_name(String location_name) {
        this.location_name = location_name;
    }

    @PropertyName("location_address")
    public String get_location_address() {
        return location_address;
    }

    @PropertyName("location_address")
    public void set_location_address(String location_address) {
        this.location_address = location_address;
    }
}

这样不管你的getter/setter命名是什么,Firebase都会严格按照注解里指定的名称存储字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:40:37