这是我的firebase google登录..我想添加用户名和电子邮件信息以保存在firebase实时数据库中..所以我添加了put方法..但这并没有按我的预期工作。每次我注销并使用相同的谷歌账户登录时,用户ID下的所有其他数据都会被删除,即使数据位于其他节点中。
private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d("TAG", "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
String userID = mAuth.getCurrentUser().getUid();
String userName = mAuth.getCurrentUser().getDisplayName();
String userEmail = mAuth.getCurrentUser().getEmail();
DatabaseReference current_user_db = FirebaseDatabase.getInstance().getReference().child("Users");
Map newPost = new HashMap();
newPost.put("userName", userName);
newPost.put("userEmail", userEmail);
current_user_db.setValue(newPost);
} else {
// If sign in fails, display a message to the user.
Log.w("TAG", "signInWithCredential:failure", task.getException());
Toast.makeText(SignUpActivity.this, "Authentication failed.",
Toast.LENGTH_LONG).show();
// updateUI(null);
}
// ...
}
});
}
当您使用“setValue”方法时,它会覆盖所有数据,请尝试使用 updateChildren 来代替,
完整代码:
private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d("TAG", "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
String userID = mAuth.getCurrentUser().getUid();
String userName = mAuth.getCurrentUser().getDisplayName();
String userEmail = mAuth.getCurrentUser().getEmail();
DatabaseReference current_user_db = FirebaseDatabase.getInstance().getReference().child("Users");
Map newPost = new HashMap();
newPost.put("userName", userName);
newPost.put("userEmail", userEmail);
current_user_db.updateChildren(newPost); // This is the important line
} else {
// If sign in fails, display a message to the user.
Log.w("TAG", "signInWithCredential:failure", task.getException());
Toast.makeText(SignUpActivity.this, "Authentication failed.",
Toast.LENGTH_LONG).show();
// updateUI(null);
}
// ...
}
});
}
我刚刚从代码中删除了 setValue() 函数。
private void firebaseAuthWithGoogle(String idToken){
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
auth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
Log.d("TAG","signInWithCredential:success");
FirebaseUser user = auth.getCurrentUser();
UserModel users = new UserModel();
users.setEmail(user.getEmail());
users.setName(user.getDisplayName());
users.setPhoneNo(user.getPhoneNumber());
database.getReference().child("Users").child(user.getUid());
Intent intent = new Intent(SignInActivity.this, MainActivity.class);
startActivity(intent);
Toast.makeText(SignInActivity.this, "Signed in with Google",Toast.LENGTH_SHORT).show();
}else{
Log.w("TAG","signInWithCredential:failure",task.getException());
}
}
});
}