Android Проверка базы данных Firebase, если имя пользователя уже используется - PullRequest
0 голосов
/ 30 апреля 2020

привет, я ищу способ проверить, используется ли уже имя пользователя или нет.

Проблема в том, что если имя пользователя уже занято, ошибка отображается правильно, но пользователь по-прежнему регистрируется ...

private boolean validateForm () {
        boolean valid = true;

        String username = rUsernameField.getText().toString();
        String email = rEmailField.getText().toString();
        if (TextUtils.isEmpty(email)) {
            rEmailField.setError(getText(R.string.field_error));
            valid = false;
        } else {
            rEmailField.setError(null);
        }

        String password = rPasswordField.getText().toString();
        if (TextUtils.isEmpty(password)) {
            rPasswordField.setError(getText(R.string.field_error));
            valid = false;
        } else {
            rPasswordField.setError(null);
        }

        if (TextUtils.isEmpty(username)) {
            rUsernameField.setError(getText(R.string.field_error));
            valid = false;
            validUsername = false;
        } else {
            rUsernameField.setError(null);
        }
        if (!validUsername) {
            valid = false;
        }
        if (rCGUCheck.isChecked()) {
            rCGUCheck.setError(null);
        } else {
            rCGUCheck.setError(getText(R.string.err_cgu));
            valid = false;
        }

        return valid;
    }

public void setValidUsername() {
    String username = rUsernameField.getText().toString();
    FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username").equalTo(username).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                validUsername = false;
                Log.d(TAG, "false");
                rUsernameField.setError("This username already exists");
            } else {
                validUsername = true;
                Log.d(TAG, "true");
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}

private void signUp() {
        Log.d(TAG, "signUp");
        if (!validateForm()) {
            return;
        }


@Override
    public void onClick (View v){
        int i = v.getId();
        if (i == R.id.regBtn) {
            setValidUsername();
            signUp();
        }

, поэтому, если одно из полей не заполнено, пользователь не может зарегистрироваться. Но я не понимаю, почему, даже если имя пользователя уже существует, пользователь все равно может зарегистрироваться ^^

Заранее благодарен.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Имеет одну функцию с именем validateUser:

public void validateUser() {

//get string from editTexts
String username = rUsernameField.getText().toString();
String email = rEmailField.getText().toString();
String password = rPasswordField.getText().toString();

FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username").equalTo(username).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
//username is not available

rUsernameField.setError("This username already exists");

} else {
//username is available


//so check now if all is okay
if(!TextUtils.isEmpty(email) && !TextUtils.isEmpty(password) && !TextUtils.isEmpty(username) && rCGUCheck.isChecked()){

 signUp();
}
}

}

@Override
 public void onCancelled(@NonNull DatabaseError databaseError) {

}
});

}

Метод signUp():

private void signUp(){
//sign up
Log.d(TAG, "signUp");
}

onclick() метод

@Override
public void onClick (View v){
int i = v.getId();
if (i == R.id.regBtn) {

validateUser();

}
0 голосов
/ 30 апреля 2020

Ваш setValidUsername является асинхронной операцией. Данные загружаются из Firebase асинхронно (как и в большинстве облачных API), так как это может занять некоторое время. Пока это происходит, ваш основной код продолжается и ваш метод signUp выполняется. Затем, когда данные доступны, ваш onDataChange вызывается и устанавливает validUsername.

. Хороший пример этого и решения см. В моем ответе здесь: getContactsFromFirebase () метод возвращает пустой list


Для вас это может означать:

  1. Определение интерфейса для вашего собственного обратного вызова:

    public interface UserExistsCallback {
      void onCallback(boolean value);
    }
    
  2. Измените setValidUsername, чтобы принять этот обратный вызов в качестве аргумента и вызвать его:

    public void isValidUsername(UserExistsCallback callback) {
        String username = rUsernameField.getText().toString();
        FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username").equalTo(username).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    callback.onCallback(false);
                    rUsernameField.setError("This username already exists");
                } else {
                    callback.onCallback(true);
                    Log.d(TAG, "true");
                }    
            }
    
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                throw databaseError.toException(); // never ignore errors    
            }
        });
    }
    
  3. Вызвать эту новую функцию и использовать значение в обратном вызове:

    isValidUsername(new UserExistsCallback() {
      @Override
      public void onCallback(boolean exists) {
        System.out.println("User exists: "+exists);
      }
    });
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...