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

Firebase实时数据库无法保存数据且onComplete未触发的解决方法

Firebase实时数据库写入失败排查方案

问题描述

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:00:56