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

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,视图绑定会直接失败,触发运行时崩溃

修复方案

  1. 补全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;}
    }
    
  2. 给数据库写入操作添加完成/失败监听,替换原注册成功后的逻辑,参考代码如下:
    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();
    }
    
  3. 统一拼写:确认布局文件中密码输入框的ID和代码中绑定的变量名完全一致,避免视图绑定失败。

内容的提问来源于stack exchange,提问作者ratim shariar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:57:38