2017-06-18 1 views
2

Firebase DBにユーザ名がすでに存在するかどうかを検証し、それを検証する方法を作成しようとしています。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を返してから、DBでユーザ名を検索しています。したがって、ユーザ名は常にDBに上書きされます。

この方法は、ここから呼び出されます。

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

Firebaseは非同期にデータをロードしてください。これは、 '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はvoidメソッドです。そのようには動作しません –

+0

すぐに呼び出されるのではなく、データが受信されたときに呼び出されるため、戻り値は –

+0

より前に呼び出されます。リスナーの代わりにデータを呼び出すだけの他の方法があるかどうか教えてください。 –

関連する問題