Firebase Auth注册后用户额外数据无法上传至Realtime Database求助
问题原因及解决方法
1. 异步写入操作被中断
setValue()是异步操作,你在调用写入方法后直接执行finish()关闭当前Activity,会导致未完成的写入请求被系统中断,无法成功上传数据。
解决方法:给setValue()添加完成监听器,等写入操作执行结束后再关闭页面,修改后的代码参考:
public void tryRegister(View view){ authService.createUserWithEmailAndPassword (this.email.getText().toString(),this.password.getText().toString()) .addOnCompleteListener(this, task -> { if (task.isSuccessful()){ String uid = authService.getCurrentUser().getUid(); Map<String, String> userDetails = new HashMap<String, String>(); userDetails.put("username", this.username.getText().toString()); DatabaseReference usersInfo = database.getReference("usersInfo"); // 给写入操作添加监听器 usersInfo.child(uid).setValue(userDetails) .addOnSuccessListener(aVoid -> { // 写入成功后再关闭页面 setResult(RESULT_OK); finish(); }) .addOnFailureListener(e -> { // 写入失败可以打印日志排查问题 this.failedReg.setText("用户信息保存失败:"+e.getMessage()); setResult(RESULT_CANCELED); finish(); }); } else{ this.failedReg.setText("error in the registration process"); } }); }
2. 数据库安全规则配置错误
Firebase Realtime Database默认的安全规则会拦截未授权的写入请求,如果你没有调整过规则配置,就会出现写入无响应的情况。
你需要进入Firebase控制台的Realtime Database页面,切换到「规则」标签,配置usersInfo节点的写入权限,示例规则如下(仅允许用户读写自己uid对应的节点数据):
{ "rules": { "usersInfo": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
3. 依赖冗余问题
你的应用级依赖中重复声明了两次com.google.firebase:firebase-bom,虽然不会直接导致写入失败,但建议删除重复的bom声明,避免出现版本兼容问题。
4. 数据库实例连接问题
如果你使用的是非默认区域的Realtime Database实例,需要在初始化数据库实例时传入对应数据库的URL,否则会连接到错误的实例导致写入失败,初始化示例:
FirebaseDatabase database = FirebaseDatabase.getInstance("你的数据库URL");
内容的提问来源于stack exchange,提问作者guy fayzak
相关产品推荐
相关产品推荐

