2017-06-18 69 views
2

我試圖驗證Firebase數據庫中是否存在用戶名,並創建了驗證它的方法。Firebase Android查詢和Java方法

如果用戶名可用,該方法應返回true,如果用戶名已被佔用,則返回false。

public boolean isUsernameValid(final String newUsername, String oldUsername){ 
    if(newUsername.equals(oldUsername)){ 
     //if username is not changed 
     return true; 
    }else { 
     userValid = true; 
     databaseReference.orderByChild("Username").equalTo(newUsername).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       long userCount = dataSnapshot.getChildrenCount(); 
       if(userCount!=0){ 
        userValid = false; 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 

     }); 
     return userValid; //username is valid if this returns true 
    } 
} 

此方法首先返回UserValid布爾值,然後查詢數據庫。請讓我知道如果我錯過了什麼。

這首先返回true,然後在數據庫中搜索用戶名,因此它總是覆蓋數據庫中的用戶名。

此方法從這裏稱爲:

if(!TextUtils.isEmpty(str_firstName) 
       && !TextUtils.isEmpty(str_lastName) 
       && !TextUtils.isEmpty(str_username) 
       && verify.isEmailValid(str_email) 
       && verify.isMobileNoValid(str_mobile) 

//here 
       && verify.isUserNameValid(str_username, globalSharedPrefs.getUserDetail("username").toString())){ 
      progressDialog.setMessage("Saving Profile ..."); 
      progressDialog.show(); 

      //saving the photo 
      if(isImageClicked) { 
       filepath = storageReference.child("profile_photos").child(globalSharedPrefs.getUserDetail("uid").toString()); 
       filepath.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
        @Override 
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
         //TODO: add picture remote/edit button in the XML 
         isImageClicked = false; 
         downloadUri = taskSnapshot.getDownloadUrl(); 
         databaseReference.child("Profile Picture").setValue(downloadUri.toString()); 
         uploadUserInfo(); 
         Toast.makeText(UserProfileActivity.this, "Profile Saved.!", Toast.LENGTH_LONG) 
           .show(); 
        } 
       }).addOnFailureListener(new OnFailureListener() { 
        @Override 
        public void onFailure(@NonNull Exception e) { 
         progressDialog.dismiss(); 
         updateProfileUI(); 
         clickEditProfileButton(false); 
         Toast.makeText(UserProfileActivity.this, "Update Failed.!", Toast.LENGTH_LONG) 
           .show(); 
        } 
       }); 
      } 

數據庫結構

{ 
    "userinfo" : { 
    "J6Y4Dtxe7Nh45B653U5AVXHFrSJ2" : { 
     "AccountId" : "", 
     "DOB" : "21 Jun, 2017", 
     "First Name" : "Krishna", 
     "Last Name" : "kk", 
     "Mobile" : "", 
     "Username" : "kittuov", 
     "uid" : "J6Y4Dtxe7Nh45B653U5AVXHFrSJ2" 
    }, 
    "ck8x94FeHtUbC9DgHCkxmQt93Ar1" : { 
     "AccountId" : "", 
     "DOB" : "7 Dec, 1992", 
     "First Name" : "Seshagiri Rao", 
     "Last Name" : "Kornepati", 
     "Mobile" : "", 
     "Username" : "seshu1", 
     "uid" : "ck8x94FeHtUbC9DgHCkxmQt93Ar1" 
    }, 
    "iDBn0lYIZFSgll9KyVje0T6JFIy2" : { 
     "AccountId" : "", 
     "DOB" : "", 
     "First Name" : "Ramesh", 
     "Last Name" : "Devarapu", 
     "Mobile" : "", 
     "Username" : "rameshb", 
     "uid" : "iDBn0lYIZFSgll9KyVje0T6JFIy2" 
    } 
    } 
+0

火力地堡異步加載數據。這意味着,執行'return'語句時,數據尚未加載(通過設置斷點來嘗試)。爲更廣泛的解釋,請參閱我的答案在這裏:https://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –

回答

0

試試這個

if(str_username.equals(globalSharedPrefs.getUserDetail("username").toString()))){ 
    sumbit(); 
}else { 

    databaseReference.orderByChild("Username").equalTo(newUsername).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      long userCount = dataSnapshot.getChildrenCount(); 
      if(userCount==0){ 
       sumbit(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 

    }); 

    private void sumbit(){ 
if(!TextUtils.isEmpty(str_firstName) 
      && !TextUtils.isEmpty(str_lastName) 
      && !TextUtils.isEmpty(str_username) 
      && verify.isEmailValid(str_email) 
      && verify.isMobileNoValid(str_mobile) 
     ){ 
     progressDialog.setMessage("Saving Profile ..."); 
     progressDialog.show(); 

     //saving the photo 
     if(isImageClicked) { 
      filepath = storageReference.child("profile_photos").child(globalSharedPrefs.getUserDetail("uid").toString()); 
      filepath.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
        //TODO: add picture remote/edit button in the XML 
        isImageClicked = false; 
        downloadUri = taskSnapshot.getDownloadUrl(); 
        databaseReference.child("Profile Picture").setValue(downloadUri.toString()); 
        uploadUserInfo(); 
        Toast.makeText(UserProfileActivity.this, "Profile Saved.!", Toast.LENGTH_LONG) 
          .show(); 
       } 
      }).addOnFailureListener(new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception e) { 
        progressDialog.dismiss(); 
        updateProfileUI(); 
        clickEditProfileButton(false); 
        Toast.makeText(UserProfileActivity.this, "Update Failed.!", Toast.LENGTH_LONG) 
          .show(); 
       } 
      }); 
     } 
     } 
+0

OnDataChange是一個無效的方法。它不是那樣工作的 –

+0

但是不立即被調用,它在數據被接收時調用,所以返回在 –

+0

之前被調用。你能告訴我,如果有其他方法只需要調用數據而不是Listener? –