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

Android Java:Firebase邮箱密码注册额外字段重复存储问题

解决Firebase实时数据库用户注册时字段重复的问题

嘿,我来帮你搞定这个字段重复的问题!你遇到的情况其实是Firebase Realtime Database序列化Java对象时的规则导致的,咱们一步步分析解决:

问题根源

你的Userinformation类里同时存在两种会被Firebase序列化的元素:

  • 公开的成员变量name和kredi
  • 命名为getUserName()和getUserKredi()的getter方法

Firebase在把对象存入数据库时,会同时处理这两者:

  1. 直接将公开成员变量的名称作为数据库字段(也就是name、kredi)
  2. 对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:47:51