Firebase实时数据库无法保存数据且onComplete未触发的解决方法
问题描述
在Android Studio项目中通过NewTraineeActivity和Trainee类向Firebase实时数据库注册学员数据,数据库已设置全读写权限,但点击注册按钮后仅能看到“Register button clicked”日志,数据未保存到数据库,且setValue的onComplete回调也未触发。已排查网络连接、数据库引用路径及异常处理,问题仍未解决。
相关代码及配置
Trainee类代码
public class Trainee { private String firstName; private String lastName; private int age; private double height; private String gender; private String email; private String nationality; public Trainee(String firstName, String lastName, int age, double height, String gender, String email, String nationality) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.height = height; this.gender = gender; this.email = email; this.nationality = nationality; } // 省略getter和setter方法 }
NewTraineeActivity核心代码
public class NewTraineeActivity extends AppCompatActivity { private FirebaseAuth firebaseAuth; private DatabaseReference databaseReference; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_trainee); firebaseAuth = FirebaseAuth.getInstance(); FirebaseUser user = firebaseAuth.getCurrentUser(); FirebaseApp.initializeApp(this); if (user == null) { Toast.makeText(this, "User not authenticated", Toast.LENGTH_SHORT).show(); return; } databaseReference = FirebaseDatabase.getInstance().getReference().child("trainees").child(user.getUid()); // 省略UI初始化及按钮点击事件 } private void registerTrainee() { Log.d("NewTraineeActivity", "Registration Started"); // 省略数据收集逻辑 Trainee trainee = new Trainee(firstName, lastName, age, height, gender, email, nationality); databaseReference.push().setValue(trainee).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { // 省略回调处理逻辑 } }); } }
Firebase实时数据库规则
{ "rules": { ".read": true, ".write": true } }
可行解决方案
添加工厂无参构造函数
Firebase实时数据库要求实体类必须具备无参构造函数,才能完成对象的序列化与反序列化。当前Trainee类仅提供带参构造,会导致Firebase无法实例化对象,最终出现写入失败且无回调触发的情况。修改后的Trainee类如下:public class Trainee { private String firstName; private String lastName; private int age; private double height; private String gender; private String email; private String nationality; // 必须添加的无参构造函数 public Trainee() {} public Trainee(String firstName, String lastName, int age, double height, String gender, String email, String nationality) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.height = height; this.gender = gender; this.email = email; this.nationality = nationality; } // 保留原getter和setter方法 }调整Firebase初始化顺序
原代码中FirebaseApp.initializeApp(this)的位置在获取FirebaseAuth实例之后,可能导致初始化异常,进而影响数据库操作。调整初始化顺序:@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_trainee); // 优先初始化FirebaseApp FirebaseApp.initializeApp(this); firebaseAuth = FirebaseAuth.getInstance(); FirebaseUser user = firebaseAuth.getCurrentUser(); if (user == null) { Toast.makeText(this, "User not authenticated", Toast.LENGTH_SHORT).show(); return; } databaseReference = FirebaseDatabase.getInstance().getReference().child("trainees").child(user.getUid()); // 省略UI初始化及按钮点击事件 }添加失败回调捕获异常
仅依赖onComplete监听无法精准定位失败原因,添加addOnFailureListener可以捕获具体错误信息:databaseReference.push().setValue(trainee) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Log.d("NewTraineeActivity", "Registration successful"); Toast.makeText(NewTraineeActivity.this, "Registered", Toast.LENGTH_SHORT).show(); } else { Log.e("NewTraineeActivity", "Registration failed", task.getException()); } } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.e("NewTraineeActivity", "Write failed", e); Toast.makeText(NewTraineeActivity.this, "Failed: " + e.getMessage(), Toast.LENGTH_SHORT).show(); } });验证数据收集逻辑
检查registerTrainee方法中收集的firstName、age等变量是否为有效值,避免出现null、负数年龄、0值身高这类非法数据,部分非法数据会导致Firebase静默写入失败。统一Firebase依赖版本
确保项目中Firebase Auth与Realtime Database的依赖版本一致,避免版本兼容问题。例如在Module级build.gradle中:implementation 'com.google.firebase:firebase-auth:22.3.1' implementation 'com.google.firebase:firebase-database:20.3.0'版本号以Firebase官方最新发布为准。
内容的提问来源于stack exchange,提问作者Olsen Dhaba

