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
相关产品推荐
相关产品推荐

