将变量声明为Firebase函数的最终变量。检查用户名和电子邮件是否存在

时间:2017-12-05 14:21:54

标签: java android firebase-realtime-database

我正在尝试制作一个注册页面。在注册该用户之前,我将尝试验证数据库中不存在的用户名和电子邮件。但是,当用户名/电子邮件已经存在时,我不知道该变量是否为false,因此它最终仍然会注册用户。
我怎样才能做到这一点?请指导我。

在注册用户之前检查用户名和电子邮件是否已存在:

            if (!checkIfUsernameExists(userName) && !checkIfEmailExists(userEmail)){
            registerUser();
        }

检查用户名是否存在的方法:

    public boolean checkIfUsernameExists(String userName){
    boolean isExist = false;
    databaseReferenceUser.orderByChild("userName").equalTo(userName).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                editTextUserNameRegister.setError("Username already exists");
                editTextUserNameRegister.requestFocus();
                final boolean isExist = true;
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return isExist;
}

检查电子邮件是否已存在的方法:

    public boolean checkIfEmailExists(String userEmail){
    boolean isExist = false;
    databaseReferenceUser.orderByChild("userEmail").equalTo(userEmail).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                editTextEmailRegister.setError("Email already exists");
                editTextEmailRegister.requestFocus();
                final boolean isExist = true;
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return isExist;
}

3 个答案:

答案 0 :(得分:3)

您需要自己的回调才能等待Firebase返回数据。一个例子看起来像这样

定义界面

public interface UserCallback {
    void onUserExists(Boolean exists);
} 

让你的方法无效并添加回调参数,使其成为最终版,以便可以在Firebase方法中引用

public void checkIfEmailExists(String userEmail, final UserCallback callback){
databaseReferenceUser.orderByChild("userEmail").equalTo(userEmail).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()){
            editTextEmailRegister.setError("Email already exists");
            editTextEmailRegister.requestFocus();
            callback.onUserExists(true);
        } else {
            callback.onUserExists(false);
        } 
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

// return isExist;  // this method is void now
}

现在,您必须在功能上而不是在程序上编写其他代码。

checkIfUsernameExists(userName, new UserCallback() {
    @Override 
    public void onUserExists(Boolean exists) {
        if (!exists) {
            checkIfEmailExists(userEmail, new UserCallback() {
                // registerUser() if not exists 
             } 
        } 
     } 
} );

如果您要存储唯一的用户名/电子邮件,则无需同时检查

可在此处找到更完整的界面定义Wait Firebase async retrive data in android

答案 1 :(得分:2)

我发现您使用的是Firebase,使用FirebaseAuth会更好一些,它可以让您以安全,加密和多功能的方式对用户进行身份验证。如果您使用数据库,您可能会冒隐私和用户帐户的安全性(我假设密码未加密,访问规则并非完全私密)。

添加您的Gradle文件:

compile 'com.google.firebase:firebase-auth:11.6.2'

然后您只需启用电子邮件/密码验证:

<强> LoginRegisterActivity.java

1 - 获取实例。

FirebaseAuth mAuth = FirebaseAuth.getInstance();

2 - 获取用户。一旦注册和/或登录,它将被保存。

FirebaseUser user = mAuth.getCurrentUser();

3 - 所以让我们尝试创建一个新用户

mAuth.createUserWithEmailAndPassword(email,password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {                           
                    if(task.isSuccessful()){
                       //User registered successfully
                    }else{
                       // WAIT! SOMETHING WENT WRONG, DESPITE IT IS COMPLETE
                    }
                }
            });

4 - 如果任务成功,您可以保留所有内容,finish()活动,FirebaseAuth将为您保存,您可以从应用中的任何位置获取信息。

5 - 但任务可能不成功,这是因为项目中已有另一位用户使用相同的电子邮件。因此,在else onComplete()内,您可以尝试登录用户。这也很简单。

mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
                @Override public void onComplete(@NonNull Task<AuthResult> task) {
//And here you can do whatever you want: create a file on your DB, send a verification email...
});

答案 2 :(得分:0)

已经定义了boolean isExist,不需要再次声明它。

public void checkIfEmailExists(String userEmail){
        databaseReferenceUser.orderByChild("userEmail").equalTo(userEmail).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                boolean isExist = dataSnapshot.exists();
                if (isExist){
                    editTextEmailRegister.setError("Email already exists");
                    editTextEmailRegister.requestFocus();
                    if(isExist){
                      //call your required method to do next steps   
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

     }