我创建了一个名为Users
的节点。我想创建一个子节点,其名称为注册自己的用户的Uid
,并将他/她的所有个人资料信息存储在该子节点中。
仅当用户已成功注册到数据库时才会发生。所以我使用了以下代码:
mAuth.createUserWithEmailAndPassword(user.getEmail(), password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("MainActivity", "signIn:onComplete:" + task.isSuccessful());
if (task.isSuccessful()) {
DatabaseReference userDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
userDatabaseReference.child(task.getResult().getUser().getUid())
.setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(ResetPassword.this, "user registred to database", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(ResetPassword.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
} else {
Toast.makeText(ResetPassword.this, "Registration Failed",
Toast.LENGTH_SHORT).show();
}
}
});
但是我的代码无效。用户已成功注册,但数据库中未创建子项。应使用用户的Uid名称创建。
当我添加断点时,如下所示:
我发现编译器在第82行之后直接进入第106行而没有在其间执行任何行,但它仍然调用在完成时调用内部的MainActivity。
我不明白这是怎么回事。提前谢谢。
答案 0 :(得分:0)
更改
userDatabaseReference.child(mAuth.getCurrentUser().getUid()).setValue(userInfo)
到
userDatabaseReference.child(mAuth.getCurrentUser().getUid()).push().setValue(userInfo)
答案 1 :(得分:0)
也许FirebaseAuthentication.currentUser
尚未初始化。尝试从作为参数传递给onComplete
方法的任务中获取它的内容:
if (task.isSuccessful()) {
userDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
userDatabaseReference.child(task.getResult().getUser().getUid()).setValue(userInfo).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(context, "user registred to database", Toast.LENGTH_SHORT).show();
}
});
}
答案 2 :(得分:0)
更新完成侦听器的onComplete()
以查看失败原因:
userDatabaseReference.child(mAuth.getCurrentUser().getUid()).setValue(userInfo)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(context, "user registred to database", Toast.LENGTH_SHORT).show();
} else {
System.out.println("onComplete: " + task.getException().getMessage());
}
}
});
您的数据库安全规则可能存在问题。
答案 3 :(得分:0)
实际上问题出在与Firebase的连接上。我没有使用与Firebase相同的帐户登录android studio,这就是我无法与Firebase通信的原因。