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

如何在Firebase实时数据库中实现数据保存功能?

Firebase实时数据库数据保存的正确实现

我正在尝试将Firebase实时数据库的数据加载到Android应用中,已经实现了加载按钮的代码,但编写的保存数据按钮代码不确定是否正确,希望了解如何正确实现Firebase实时数据库的数据保存操作。

现有代码背景

加载数据的按钮代码

load.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        database.child(emailString).get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DataSnapshot> task) {
                if(task.isSuccessful()) {
                    DataSnapshot snapshot = task.getResult();
                    Russian_Reno = snapshot.child("russian_reno").getValue(Integer.class);
                    T_18_1927 = snapshot.child("T_18_1927").getValue(Integer.class);
                    // 其余字段的读取和保存到PreferenceConfig的代码
                    PreferenceConfig.RussianReno(getApplicationContext(), Russian_Reno);
                    PreferenceConfig.T_18_1927(getApplicationContext(), T_18_1927);
                    PreferenceConfig.T_18_1929(getApplicationContext(), T_18_1929);
                    PreferenceConfig.T_18_1930(getApplicationContext(), T_18_1930);
                    PreferenceConfig.T_18M(getApplicationContext(), T_18M);
                    PreferenceConfig.T_20(getApplicationContext(), T_20);
                    PreferenceConfig.T_26_1931(getApplicationContext(), T_26_1931);
                    PreferenceConfig.T_26_1932(getApplicationContext(), T_26_1932);
                    PreferenceConfig.T_26_1933(getApplicationContext(), T_26_1933);
                    PreferenceConfig.T_26_1936(getApplicationContext(), T_26_1936);
                    PreferenceConfig.T_26_1938(getApplicationContext(), T_26_1938);
                    PreferenceConfig.T_26_1939(getApplicationContext(), T_26_1939);
                    PreferenceConfig.T_26PT(getApplicationContext(), T_26PT);
                    PreferenceConfig.TY_26_TT_26(getApplicationContext(), TY_26_TT_26);
                    PreferenceConfig.TY_132_TT_131(getApplicationContext(), TY_132_TT_131);
                    PreferenceConfig.T_26A(getApplicationContext(), T_26A);
                    PreferenceConfig.XT_26(getApplicationContext(), xT_26);
                    PreferenceConfig.XT_130(getApplicationContext(), xT_130);
                    PreferenceConfig.XT_133(getApplicationContext(), xT_133);
                    PreferenceConfig.XT_134(getApplicationContext(), xT_134);
                    PreferenceConfig.CT_26(getApplicationContext(), ct_26);
                    PreferenceConfig.T_26_T(getApplicationContext(), T_26_T);
                    PreferenceConfig.BT_1(getApplicationContext(), bt_1);
                    PreferenceConfig.M1930(getApplicationContext(), m1930);
                } else {
                    Log.d("Firebase", task.getException().getMessage());
                }
            }
        });
    }
});

数据库JSON结构

{
  "mail@gmailcom": {
    "battles": 5000,
    "broneboynie": 7000,
    "bt_1": 500,
    "bt_2": 0,
    "bt_2_H": 0,
    "bt_2_IS": 0,
    "bt_2_P": 0,
    "bt_2_PP": 0,
    "bt_2_PY": 0,
    "bt_2_PY_B_SH_u": 0,
    "bt_2_S": 0,
    "bt_3": 0,
    "bt_4": 0,
    "bt_5": 0,
    "bt_5_A": 0,
    "bt_5_B_2": 0,
    "bt_5_IS": 0,
    "bt_5_PT": 0,
    "bt_5_Px": 0,
    "bt_6": 0,
    "bt_7": 0
  },
  "mail1212@gmailcom": {
    "battles": 5000,
    "broneboynie": 7000,
    "bt_1": 500,
    "bt_2": 0,
    "bt_2_H": 0,
    "bt_2_IS": 900,
    "bt_2_P": 0,
    "bt_2_PP": 0,
    "bt_2_PY": 0,
    "bt_2_PY_B_SH_u": 0,
    "bt_2_S": 0,
    "bt_3": 0,
    "bt_4": 0,
    "bt_5": 0,
    "bt_5_A": 0,
    "bt_5_B_2": 0,
    "bt_5_IS": 0,
    "bt_5_PT": 0,
    "bt_5_Px": 0,
    "bt_6": 0,
    "bt_7": 0
  }
}

User类(简化版)

package anotherPackage;
public class User {
    private int battles;
    private String email;
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    public int getBattles() { return battles; }
    public void setBattles(int battles) { this.battles = battles; }
    // 其余字段及getter/setter未补充
}

PreferenceConfig类(简化版)

public class PreferenceConfig {
    private static final String MY_PREFERENCE_NAME = "com.ccs.example";
    public static final String BATTLES = "battles";
    public static final String EMAIL = "email";

    public static void email(Context context, String count) {
        SharedPreferences pref = context.getSharedPreferences(MY_PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putString(EMAIL, count);
        editor.apply();
    }

    public static String emailString(Context context) {
        SharedPreferences pref = context.getSharedPreferences(MY_PREFERENCE_NAME, Context.MODE_PRIVATE);
        return pref.getString(EMAIL,"");
    }

    public static void battles(Context context, int count) {
        SharedPreferences pref = context.getSharedPreferences(MY_PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putInt(BATTLES, count);
        editor.apply();
    }

    public static int battlesInt(Context context) {
        SharedPreferences pref = context.getSharedPreferences(MY_PREFERENCE_NAME, Context.MODE_PRIVATE);
        return pref.getInt(BATTLES, 0);
    }
}

当前保存按钮代码(存在问题)

User user = new User();
save.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String a = emailString.replace(".", "");
        if(database.child(a)==null) {
            user.setrussian_reno(Russian_Reno);
            user.setT_18_1927(T_18_1927);
            user.setT_18_1929(T_18_1929);
            user.setT_18_1930(T_18_1930);
            user.setT_18m(T_18M);
            user.setT_20(T_20);
            user.setT_26_1931(T_26_1931);
            user.setT_26_1932(T_26_1932);
            user.setT_26_1933(T_26_1933);
            user.setT_26_1936(T_26_1936);
            user.setT_26_1938(T_26_1938);
            user.setT_26_1939(T_26_1939);
            user.setT_26PT(T_26PT);
            user.setty_26_tt_26(TY_26_TT_26);
            user.setT_26A(T_26A);
            user.setxT_26(xT_26);
            user.setxT_130(xT_130);
            user.setxT_133(xT_133);
            user.setxT_134(xT_134);
            user.setct_26(ct_26);
            user.setT_26_T(T_26_T);
            user.setbt_1(bt_1);
            user.setm1930(m1930);
            user.setbt_2(bt_2);
            user.setbt_2_PP(bt_2_PP);
            user.setbt_2_P(bt_2_P);
            user.setbt_2_PY(bt_2_PY);
            user.setbt_2_PY_B_SH_u(bt_2_PY); // 参数错误
            user.setbt_2_H(bt_2_H);
            user.setbt_2_S(bt_2_S);
            user.setbt_2_IS(bt_2_IS);
            user.setbt_3(bt_3);
            user.setbt_4(bt_4);
            user.setbt_5(bt_5);
            user.setbt_5_A(bt_5_A);
            user.setbt_5_PT(bt_5_PT);
            user.setbt_5_IS(bt_5_IS);
            user.setbt_5_B_2(bt_5_B_2);
            user.setxbt_5(xbt_5);
            user.setrbt_5(rbt_5);
            user.setbt_5_Px(bt_5_PX);
            database.child(emailString).setValue(user);
        }
    }
});

现有保存代码的问题

  • 节点存在判断错误:if(database.child(a)==null) 永远不会成立,DatabaseReference对象即使对应路径不存在也会被创建,无法通过判断引用是否为null来确认节点是否存在。
  • User类字段不完整:当前User类仅包含battles和email字段,但数据库和保存代码中存在大量其他字段(如russian_reno、bt_1等),缺少对应字段及getter/setter会导致Firebase无法正确序列化对象。
  • 参数传递错误:user.setbt_2_PY_B_SH_u(bt_2_PY) 中传入的参数应为bt_2_PY_B_SH_u,而非bt_2_PY。
  • 无结果监听:未添加addOnSuccessListener或addOnFailureListener,无法得知保存操作是否成功,也无法捕获错误。
  • 数据覆盖风险:使用setValue(user)会覆盖整个用户节点的所有数据,若仅需更新部分字段,会导致未设置的字段丢失。

正确的保存实现步骤

1. 完善User类

确保User类包含数据库中所有对应的字段,并提供无参构造函数(Firebase序列化必须)和完整的getter/setter方法:

package anotherPackage;

public class User {
    private int battles;
    private String email;
    private int russian_reno;
    private int T_18_1927;
    private int T_18_1929;
    private int T_18_1930;
    private int T_18M;
    private int T_20;
    private int T_26_1931;
    private int T_26_1932;
    private int T_26_1933;
    private int T_26_1936;
    private int T_26_1938;
    private int T_26_1939;
    private int T_26PT;
    private int TY_26_TT_26;
    private int T_26A;
    private int xT_26;
    private int xT_130;
    private int xT_133;
    private int xT_134;
    private int ct_26;
    private int T_26_T;
    private int bt_1;
    private int m1930;
    private int bt_2;
    private int bt_2_PP;
    private int bt_2_P;
    private int bt_2_PY;
    private int bt_2_PY_B_SH_u;
    private int bt_2_H;
    private int bt_2_S;
    private int bt_2_IS;
    private int bt_3;
    private int bt_4;
    private int bt_5;
    private int bt_5_A;
    private int bt_5_PT;
    private int bt_5_IS;
    private int bt_5_B_2;
    private int xbt_5;
    private int rbt_5;
    private int bt_5_Px;

    // 无参构造函数,Firebase序列化必须
    public User() {}

    // 所有字段的getter和setter
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    public int getBattles() { return battles; }
    public void setBattles(int battles) { this.battles = battles; }

    public int getRussian_reno() { return russian_reno; }
    public void setRussian_reno(int russian_reno) { this.russian_reno = russian_reno; }

    public int getT_18_1927() { return T_18_1927; }
    public void setT_18_1927(int t_18_1927) { T_18_1927 = t_18_1927; }

    // 其余字段的getter/setter依次补充,此处省略重复代码
}

2. 正确实现保存按钮代码

方式一:新增或覆盖整个用户节点(适合首次创建)

若为首次创建用户数据,或需要覆盖所有字段,可使用setValue,并通过读取节点判断是否存在:

save.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 处理邮箱,去除点号
        String cleanedEmail = emailString.replace(".", "");
        DatabaseReference userRef = database.child(cleanedEmail);

        // 先检查节点是否存在
        userRef.get().addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                DataSnapshot snapshot = task.getResult();
                User user = new User();
                // 设置所有字段值
                user.setRussian_reno(Russian_Reno);
                user.setT_18_1927(T_18_1927);
                user.setT_18_1929(T_18_1929);
                user.setT_18_1930(T_18_1930);
                user.setT_18M(T_18M);
                user.setT_20(T_20);
                user.setT_26_1931(T_26_1931);
                user.setT_26_1932(T_26_1932);
                user.setT_26_1933(T_26_1933);
                user.setT_26_1936(T_26_1936);
                user.setT_26_1938(T_26_1938);
                user.setT_26_1939(T_26_1939);
                user.setT_26PT(T_26PT);
                user.setTY_26_TT_26(TY_26_TT_26);
                user.setT_26A(T_26A);
                user.setXT_26(xT_26);
                user.setXT_130(xT_130);
                user.setXT_133(xT_133);
                user.setXT_134(xT_134);
                user.setCt_26(ct_26);
                user.setT_26_T(T_26_T);
                user.setBt_1(bt_1);
                user.setM1930(m1930);
                user.setBt_2(bt_2);
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:22:15