我正在制作一个您必须登录才能继续的应用程序-如果您没有用户,则可以创建一个新帐户。这里没什么好看的。但是,当我创建一个新用户时(成功),我有一些要与用户UID作为唯一节点存储的用户有关的其他数据。
我的问题是,当我这样做时,用户身份验证UID与保存在数据库中的用户身份UID不同。参见下面的代码:
private EditText editTextEmail, editTextPassword, editTextName, editTextAge;
private Button btnSignup;
private FirebaseAuth firebaseAuth;
private DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
firebaseAuth = FirebaseAuth.getInstance();
btnSignup = findViewById(R.id.btn_signUp2);
editTextEmail = findViewById(R.id.editText_emailSignup);
editTextPassword = findViewById(R.id.editText_passwordSignup);
editTextName = findViewById(R.id.editText_nameSignup);
editTextAge = findViewById(R.id.editText_ageSignup);
btnSignup.setOnClickListener(this);
}
public void signUp(){
final String email = editTextEmail.getText().toString().trim();
final String password = editTextPassword.getText().toString().trim();
String name = editTextName.getText().toString().trim();
String age = editTextAge.getText().toString().trim();
if(TextUtils.isEmpty(email)){
Toast.makeText(this, "Please enter an email", Toast.LENGTH_LONG).show();
return;
}
if(TextUtils.isEmpty(password)){
Toast.makeText(this,"Please enter a password", Toast.LENGTH_LONG).show();
return;
}
if(TextUtils.isEmpty(name)){
Toast.makeText(this,"Please enter your name", Toast.LENGTH_LONG).show();
return;
}
if(TextUtils.isEmpty(age)){
Toast.makeText(this,"Please enter your age", Toast.LENGTH_LONG).show();
return;
}
firebaseAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
firebaseAuth.signInWithEmailAndPassword(email, password);
Toast.makeText(getApplicationContext(), "Register completed successfully", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "Error, please try again", Toast.LENGTH_SHORT).show();
return;
}
}
});
FirebaseUser fbUser = firebaseAuth.getCurrentUser();
User user = new User(email, password, name, Integer.parseInt(age));
databaseReference = FirebaseDatabase.getInstance().getReference("users");
databaseReference.child(fbUser.getUid().trim()).setValue(user);
finish();
startActivity(new Intent(this, LoginActivity.class));
}
@Override
public void onClick(View view) {
if (view == btnSignup){
signUp();
}
}
如您所见,Uid不匹配。我在做什么错了?
我读到Firebase在创建用户时实际上并未登录用户,因此,如果创建成功,我尝试登录该用户。虽然没有任何改变。
答案 0 :(得分:1)
首先要发表一些评论:
通过用于Firebase的Android SDK创建用户时,该用户已登录。因此,无需在signInWithEmailAndPassword
处理程序中调用onComplete
。
您现在要在注册之前更新数据库,因为这是异步发生的。为了确保在写入数据库之前完成注册,请将数据库代码移至onComplete
(甚至更好的onSuccess
)处理程序中。
类似这样:
firebaseAuth
.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
Toast.makeText(getApplicationContext(), "Register completed successfully", Toast.LENGTH_SHORT).show();
FirebaseUser fbUser = firebaseAuth.getCurrentUser();
User user = new User(email, password, name, Integer.parseInt(age));
databaseReference = FirebaseDatabase.getInstance().getReference("users");
databaseReference.child(fbUser.getUid()).setValue(user);
}else{
Toast.makeText(getApplicationContext(), "Error, please try again", Toast.LENGTH_SHORT).show();
return;
}
}
});
答案 1 :(得分:0)
我认为您需要了解createUserWithEmailAndPassword是异步的,并在创建用户之前立即返回。在创建用户之前,您将尝试进行数据库操作。如果有的话,他们将为以前登录的匿名用户创建数据。
如果要为新创建的用户添加一些数据,则应在回调中(在创建用户之后而不是在创建用户之前)进行操作。
还应该记住,如果已经有一个新用户登录,几乎可以肯定不希望创建新用户。考虑使用Firebase-UI处理用户登录,而不是自己编写代码。它将大大简化您的代码。
答案 2 :(得分:-1)