如何在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);
相关产品推荐
相关产品推荐

