Firebase身份验证正常但Realtime Database写入数据失败问题咨询
问题代码
mAuth .createUserWithEmailAndPassword(Demail, Dpasvord) .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { User user = new User(Dname, Demail, Dpasvord); FirebaseDatabase.getInstance().getReference("Users").child( FirebaseAuth.getInstance().getCurrentUser().getUid() ).setValue(user).addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { Toast.makeText(MainActivity2.this, "Uspjesno ste se registrovali!", Toast.LENGTH_LONG).show(); progressBar.setVisibility(View.GONE);
解决方案
- 先补充失败日志逻辑定位根因:当前代码只处理了写入成功的分支,没有捕获异常信息。在写入操作的
onComplete方法中补充else分支,打印task.getException()的完整堆栈信息,可直接定位具体报错原因。示例补充代码:} else { Log.e("DB_WRITE_ERROR", "写入失败", task.getException()); Toast.makeText(MainActivity2.this, "写入失败:" + task.getException().getMessage(), Toast.LENGTH_LONG).show(); } - 检查
User类的序列化合规性:Firebase实时数据库序列化Java类有强制要求,需满足三个条件:- 类包含公共的无参数构造方法(用于Firebase反射实例化对象)
- 所有需要存储的字段要么是public修饰,要么有对应的public getter/setter方法
- 不要混淆
User类,需在proguard规则中添加该类的混淆豁免规则,避免字段名被篡改后无法匹配写入
- 修正数据库实例初始化方式:如果你的Firebase实时数据库不是默认的us-central1区域,直接调用
FirebaseDatabase.getInstance()会默认连接美国节点,导致写入失败,需要传入你数据库的完整URL初始化,格式如下:FirebaseDatabase.getInstance("你的实时数据库完整URL").getReference("Users") - 避免UID获取异常:刚完成注册的场景下,调用
FirebaseAuth.getInstance().getCurrentUser()有小概率返回空值,建议直接从注册成功的返回结果中取UID,修改路径获取逻辑:// 替换原有getCurrentUser().getUid()的写法 String uid = task.getResult().getUser().getUid(); - 确认节点名称拼写:当前代码使用的节点名是首字母大写的
Users,检查是否和你预期的节点名大小写完全一致,Firebase数据库路径对大小写敏感。
内容的提问来源于stack exchange,提问作者Selmir Muminovic
相关产品推荐
相关产品推荐

