![](/img/trans.png)
[英]checking the email and username availability(Firebase) in Android Studio
[英]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.