Android Java:Firebase邮箱密码注册额外字段重复存储问题
解决Firebase实时数据库用户注册时字段重复的问题
嘿,我来帮你搞定这个字段重复的问题!你遇到的情况其实是Firebase Realtime Database序列化Java对象时的规则导致的,咱们一步步分析解决:
问题根源
你的Userinformation类里同时存在两种会被Firebase序列化的元素:
- 公开的成员变量
name和kredi - 命名为
getUserName()和getUserKredi()的getter方法
Firebase在把对象存入数据库时,会同时处理这两者:
- 直接将公开成员变量的名称作为数据库字段(也就是
name、kredi) - 对getter方法,会自动去掉
get前缀,把首字母转成小写,生成新的字段名(也就是userName、userKredi)
这就导致了数据库里出现两组完全重复的字段。
三种解决方案
方案1:用注解规范序列化行为
在Userinformation类上添加@IgnoreExtraProperties注解,同时把getter方法的名称和成员变量统一(或者直接删除不需要的getter):
import com.google.firebase.database.IgnoreExtraProperties; @IgnoreExtraProperties public class Userinformation { public String name; public String kredi; // Firebase必须要有空构造函数,用来反序列化 public Userinformation(){ } public Userinformation(String name,String kredi){ this.name = name; this.kredi = kredi; } // 把getter名称改成和成员变量一致,避免生成额外字段 public String getName() { return name; } public String getKredi() { return kredi; } }
方案2:使用封装式的私有成员变量
如果习惯用面向对象的封装写法,把成员变量设为私有,然后搭配标准的getter/setter:
import com.google.firebase.database.IgnoreExtraProperties; @IgnoreExtraProperties public class Userinformation { private String name; private String kredi; public Userinformation(){ } public Userinformation(String name,String kredi){ this.name = name; this.kredi = kredi; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getKredi() { return kredi; } public void setKredi(String kredi) { this.kredi = kredi; } }
这种写法下,Firebase会通过getter/setter来序列化,只会生成name和kredi两个字段。
方案3:直接删除多余的getter
如果你的代码里根本用不到getUserName()和getUserKredi()这两个方法,直接删掉它们就好:
public class Userinformation { public String name; public String kredi; public Userinformation(){ } public Userinformation(String name,String kredi){ this.name = name; this.kredi = kredi; } }
这样Firebase只会序列化公开的name和kredi字段,不会生成额外的重复项。
最后提醒
修改完代码后,记得先删除数据库里已经存在的重复数据,再重新测试注册功能,这样新注册的用户数据就只会存储一组字段啦!
内容的提问来源于stack exchange,提问作者user3590776
相关产品推荐
相关产品推荐

