Android端Firebase Realtime Database数据无法写入更新问题求解
Firebase Realtime Database 数据写入失败修复方案
问题场景
已完成项目依赖引入,配置了全开放读写权限的数据库安全规则,使用自定义Users实体类作为写入数据源,注册账号流程执行后提示成功,但Realtime Database始终未写入对应数据。
原问题代码
package com.example.chatapp; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Toast; import com.example.chatapp.Model.Users; import com.example.chatapp.databinding.ActivitySighnupBinding; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.FirebaseDatabase; public class sighnup extends AppCompatActivity { private FirebaseAuth mAuth; ActivitySighnupBinding binding; FirebaseDatabase database; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding=ActivitySighnupBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); mAuth=FirebaseAuth.getInstance(); database=FirebaseDatabase.getInstance(); binding.sighnup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mAuth.createUserWithEmailAndPassword(binding.email.getText().toString(),binding.passoward.getText().toString()) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if(task.isSuccessful()){ Users users=new Users(binding.username.getText().toString(),binding.email.getText().toString(),binding.passoward.getText().toString()); String id=task.getResult().getUser().getUid(); database.getReference().child("Users").child(id).setValue(users); Toast.makeText(sighnup.this,"success",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(sighnup.this,"error ",Toast.LENGTH_SHORT).show(); } } }); } }); } }
当前数据库安全规则
{ "rules": { ".read": true, ".write": true } }
核心问题点
- 未给
setValue()数据库写入操作添加结果回调,写入失败时没有任何错误输出,无法定位具体问题 - 自定义
Users实体类大概率缺少Firebase序列化必需的无参公开构造函数和字段公开getter方法,导致对象无法被序列化为JSON格式写入数据库,这是该类问题最高发的原因 - 未对输入框内容做非空校验,也未校验注册成功后返回的
FirebaseUser实例是否为空,极端场景下空指针会中断写入逻辑 - 代码中密码控件变量名为拼写错误的
passoward,若布局文件中控件ID为正确拼写的password,视图绑定会直接失败,触发运行时崩溃
修复方案
- 补全
Users实体类的必需结构,参考如下正确写法:public class Users { private String username; private String email; private String password; // 必须保留无参构造,供Firebase反序列化使用 public Users() {} public Users(String username, String email, String password) { this.username = username; this.email = email; this.password = password; } // 必须为所有字段添加getter方法,Firebase通过getter读取字段值 public String getUsername() {return username;} public String getEmail() {return email;} public String getPassword() {return password;} } - 给数据库写入操作添加完成/失败监听,替换原注册成功后的逻辑,参考代码如下:
if(task.isSuccessful()){ FirebaseUser user = task.getResult().getUser(); if (user == null) { Toast.makeText(sighnup.this, "用户信息获取失败", Toast.LENGTH_SHORT).show(); return; } // 取输入框内容时加trim()去掉首尾空白,同时提前做非空校验 String username = binding.username.getText().toString().trim(); String email = binding.email.getText().toString().trim(); String pwd = binding.passoward.getText().toString().trim(); if (username.isEmpty() || email.isEmpty() || pwd.isEmpty()) { Toast.makeText(sighnup.this, "输入内容不能为空", Toast.LENGTH_SHORT).show(); return; } Users users = new Users(username, email, pwd); String uid = user.getUid(); // 给setValue添加回调,明确写入结果 database.getReference().child("Users").child(uid).setValue(users) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> dbTask) { if (dbTask.isSuccessful()) { Toast.makeText(sighnup.this, "注册成功", Toast.LENGTH_SHORT).show(); } else { // 打印具体错误信息,可快速定位权限、网络、序列化等问题 Toast.makeText(sighnup.this, "数据写入失败:" + dbTask.getException().getMessage(), Toast.LENGTH_LONG).show(); } } }); }else{ Toast.makeText(sighnup.this,"注册失败:"+task.getException().getMessage(),Toast.LENGTH_SHORT).show(); } - 统一拼写:确认布局文件中密码输入框的ID和代码中绑定的变量名完全一致,避免视图绑定失败。
内容的提问来源于stack exchange,提问作者ratim shariar
相关产品推荐
相关产品推荐

