如果用户不存在,如何创建用户?

时间:2017-07-30 23:49:36

标签: java android firebase

当用户第一次在应用中使用您的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) {
                    }
                });
            }
        }
    };

1 个答案:

答案 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);

希望这能解决你的问题。