当用户第一次在应用中使用您的Google帐户登录时,我进行了此活动以在数据库中创建用户。它正在工作,但是在数据库中创建了多个用户,我不知道为什么。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_account);
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() == null) {
goLogInScreen();
} else {
final String userGoogleEmail = firebaseAuth.getCurrentUser().getEmail();
databaseUser.orderByChild("userEmail").equalTo(userGoogleEmail).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
//User already exists
} else {
//Can create new user
String id = databaseUser.push().getKey();
User user = new User(id, userGoogleEmail, null);
databaseUser.child(id).setValue(user);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
};
答案 0 :(得分:1)
这种情况正在发生,因为您使用push()
方法生成的密钥作为标识符,而不是另一个标识符,这实际上是再次创建用户,即使数据库中存在该用户。
我建议你做的是改变一点保存数据库中数据的逻辑。因此,为了解决您的问题,我使用代替email address as an identifier
代替您,因为它也是唯一的。您的数据库应如下所示:
Firebase-database
|
--- Users
|
--- jon@email,com
| |
| --- //data
|
--- jack@email,com
|
--- //data
正如您可能看到的那样,我使用,
(逗号)而非.
(点)保存了Firebase数据库中的电子邮件地址。
name@email.com - >名@电子邮件,玉米
这是因为Firebase不允许键名中包含.
等符号。因此,要存储这样的值,需要编码的电子邮件。为此,我使用以下方法重新命令:
String encodeUserEmail(String userEmail) {
return userEmail.replace(".", ",");
}
String decodeUserEmail(String userEmail) {
return userEmail.replace(",", ".");
}
要验证用户是否存在,只需将一个监听器放在Users
节点上,并在dataSnapshot对象上使用exists()
方法,如下所示:
DatabaseReference usersRef = usersDatabaseReference.child(userEmail);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!dataSnapshot.exists()) {
//create user
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(valueEventListener);
希望这能解决你的问题。