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

Firebase Realtime Database无法显示用户信息(Java)求助

Firebase Realtime Database 写入数据显示null的问题

我已经通过邮箱成功完成Firebase用户注册,但尝试保存用户姓名、狗狗年龄等信息时,Realtime Database始终显示https://dogsinfo-69ae3-default-rtdb.asia-southeast1.firebasedatabase.app/:null,无法正常存储实际数据。相关代码如下:

public class Owner extends AppCompatActivity {

  private EditText etemail;
  private EditText etpassword;
  private EditText repassword;
  private EditText OwnersName;
  private EditText DogsBreed;
  private EditText DogName;
  private EditText Address;
  private EditText DogsAge;
  private EditText ettime;
  private EditText AdditionalRequests;
  private RadioButton Comfterbul;
  private RadioButton Friend;

  Button SignIn;
  private DatabaseReference database;

  @Override 
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.owner_main);
    etemail = findViewById(R.id.email);
    etpassword = findViewById(R.id.password);
    OwnersName = findViewById(R.id.ownersName);
    repassword = findViewById(R.id.etrepassword);
    DogsBreed = findViewById(R.id.DogsBreed2);
    DogName = findViewById(R.id.DogsName);
    Address = findViewById(R.id.Address2);
    DogsAge = findViewById(R.id.DogsAge2);
    ettime = findViewById(R.id.time1);
    AdditionalRequests = findViewById(R.id.AdditionalRequests2);
    Comfterbul = findViewById(R.id.comfterbul2);
    Friend = findViewById(R.id.Friend2);
    SignIn = findViewById(R.id.SignIn);
  }

  public void savename(View view) {
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Owners name");
    myRef.setValue(OwnersName.getText().toString());
  }
  public void saveDogsBreed(View view) {
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("breed");
    myRef.setValue(DogsBreed.getText().toString());
  }
  public void saveDogName(View view) {
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Dogs Name");
    myRef.setValue(DogName.getText().toString());
  }
  public void createAccount(View view) {
    String email = etemail.getText().toString();
    String password = etpassword.getText().toString();
    String etrepassword = repassword.getText().toString();
    String ownersName = OwnersName.getText().toString();
    String DogsBreed2 = DogsBreed.getText().toString();
    String DogsName = DogName.getText().toString();
    String Address2 = Address.getText().toString();
    String DogsAge2 = DogsAge.getText().toString();
    String time1 = ettime.getText().toString();
    String AdditionalRequests2 = AdditionalRequests.getText().toString();
    boolean comfterbul2 = Comfterbul.isChecked();
    boolean Friend2 = Friend.isChecked();
    createAccountInFirebase(email, password, etrepassword, ownersName, DogsBreed2, DogsName, Address2, DogsAge2, time1, AdditionalRequests2, comfterbul2, Friend2);
  }
  public void createAccountInFirebase(String email, String password, String etrepassword, String ownersName, String DogsBreed2, String DogsName, String Address2, String DogsAge2, String time1, String AdditionalRequests2, boolean comfterbul2, boolean Friend2) {
      FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
      firebaseAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(Owner.this, new OnCompleteListener<AuthResult>() {
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) {
          if (task.isSuccessful()) { //User is successfully registered.
            UserOwner userOwner = new UserOwner(email, password, etrepassword, ownersName, DogsBreed2, DogsName, Address2, DogsAge2, time1, AdditionalRequests2, comfterbul2, Friend2);
            Toast.makeText(Owner.this, "Registration is successful", Toast.LENGTH_SHORT).show();
            firebaseAuth.getCurrentUser().sendEmailVerification();
            Intent intent = new Intent(Owner.this, LogIn.class);
            startActivity(intent);
          } else {
            Toast.makeText(Owner.this, "Registration failed. Please try again.", Toast.LENGTH_SHORT).show();
          }
        }
      });
}

问题原因及解决方法

1. 核心问题:未将用户数据写入数据库

你仅在注册成功时创建了UserOwner对象,但没有执行写入数据库的操作;同时单独的savename等方法未关联用户ID,会导致不同用户数据互相覆盖,且无法对应到具体用户。

2. 具体修正步骤

(1)确保UserOwner类符合Firebase序列化要求

Firebase需要类有无参构造函数,且所有字段提供getter方法才能正常序列化对象:

public class UserOwner {
    public String email;
    public String password;
    public String repassword;
    public String ownersName;
    public String dogsBreed;
    public String dogName;
    public String address;
    public String dogsAge;
    public String time;
    public String additionalRequests;
    public boolean isComfortable;
    public boolean isFriend;

    // 必须保留无参构造函数
    public UserOwner() {}

    public UserOwner(String email, String password, String repassword, String ownersName, String dogsBreed, String dogName, String address, String dogsAge, String time, String additionalRequests, boolean isComfortable, boolean isFriend) {
        this.email = email;
        this.password = password;
        this.repassword = repassword;
        this.ownersName = ownersName;
        this.dogsBreed = dogsBreed;
        this.dogName = dogName;
        this.address = address;
        this.dogsAge = dogsAge;
        this.time = time;
        this.additionalRequests = additionalRequests;
        this.isComfortable = isComfortable;
        this.isFriend = isFriend;
    }

    // 所有字段的getter方法
    public String getEmail() { return email; }
    public String getPassword() { return password; }
    public String getRepassword() { return repassword; }
    public String getOwnersName() { return ownersName; }
    public String getDogsBreed() { return dogsBreed; }
    public String getDogName() { return dogName; }
    public String getAddress() { return address; }
    public String getDogsAge() { return dogsAge; }
    public String getTime() { return time; }
    public String getAdditionalRequests() { return additionalRequests; }
    public boolean isComfortable() { return isComfortable; }
    public boolean isFriend() { return isFriend; }
}

(2)注册成功后写入用户数据到数据库

在注册成功的回调中,获取当前用户UID,将UserOwner对象写入到以UID为键的节点下,保证每个用户数据独立存储:

if (task.isSuccessful()) { //User is successfully registered.
    UserOwner userOwner = new UserOwner(email, password, etrepassword, ownersName, DogsBreed2, DogsName, Address2, DogsAge2, time1, AdditionalRequests2, comfterbul2, Friend2);
    
    // 获取当前用户唯一ID
    String userId = firebaseAuth.getCurrentUser().getUid();
    // 写入数据库,节点结构为 Owners/{userId}/用户数据
    FirebaseDatabase.getInstance().getReference("Owners")
        .child(userId)
        .setValue(userOwner)
        .addOnSuccessListener(aVoid -> {
            Toast.makeText(Owner.this, "注册成功,数据已保存", Toast.LENGTH_SHORT).show();
        })
        .addOnFailureListener(e -> {
            Toast.makeText(Owner.this, "数据保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        });
        
    firebaseAuth.getCurrentUser().sendEmailVerification();
    Intent intent = new Intent(Owner.this, LogIn.class);
    startActivity(intent);
}

(3)移除分散的保存方法

删除savename、saveDogsBreed等单独的保存方法,统一在注册成功时一次性写入所有数据,避免逻辑混乱和数据覆盖。

(4)添加空值检查

获取输入字段内容时,判断是否为空,避免写入null到数据库:

String ownersName = TextUtils.isEmpty(OwnersName.getText().toString()) ? "" : OwnersName.getText().toString();
// 其他输入字段同理处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:39:57