簡體   English   中英

將變量聲明為Firebase函數的最終變量。 檢查用戶名和電子郵件是否存在

[英]Declaring a variable as final for Firebase function. Checking if username and email exist

我正在嘗試制作一個注冊頁面。 在注冊該用戶之前,我將嘗試驗證用戶名和電子郵件在數據庫中不存在。 但是當用戶名/電子郵件已經存在時,我無法以某種方式將變量設置為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;
}

您需要自己的回調函數,以等待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 
             } 
        } 
     } 
} );

而且,如果您要存儲唯一的用戶名/電子郵件,則無需同時檢查兩者

可以在此處找到更完整的接口定義, 在android中等待Firebase異步獲取數據

我看到您使用的是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- 但是任務可能不會成功 ,這是因為項目中已經有另一個用戶使用相同的電子郵件。 因此,在onComplete()else中,您可以嘗試登錄用戶。 這也很簡單。

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...
});

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) {

            }
        });

     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM