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
相关产品推荐
相关产品推荐

