firebase запрашивает базу данных и возвращает значение true, но все равно переходит, если пользователь существует, и регистрирует дублирующуюся запись

#java #android #firebase #firebase-realtime-database

#java #Android #firebase #firebase-realtime-database

Вопрос:

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

Это сохраняется, только если электронное письмо зарегистрировано. Если я использовал другое электронное письмо, это не остановит процесс.

Это сохраняется, только если электронное письмо зарегистрировано, если я использовал другое электронное письмо, это не остановит процесс

 private void checkUsername() {
    final String Username = editTextUsername.getText().toString().trim();
    //Check early for the username length
    if (!TextUtils.isEmpty(Username)) {
        DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users").getRef();
        final Query UsernameReference = mDatabaseReference.orderByChild("Username").equalTo(Username);
        ValueEventListener UsernameValueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String usernameExist = dataSnapshot.getValue(String.class);

                //If the username not null
                if (usernameExist != null) {
                    //If username exist
                    if (usernameExist.equals(Username)) {
                        editTextUsername.setError("username taken");
                        editTextUsername.requestFocus();
                    } else {
                        //If not exist, proceed here, which mean success

                        //Change to your edit text
                        String email = null;
                        String password = null;
                        createAcc(email, password, Username);
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        };
        UsernameReference.addListenerForSingleValueEvent(UsernameValueEventListener);
    } else {
        editTextUsername.setError("Username too short");
        editTextUsername.requestFocus();
    }

    final String email = (editTextEmail).getText().toString().trim();
    final String password = editTextPassword.getText().toString().trim();
    //validate email

    if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
        editTextEmail.setError("please enter a valid email address");
        return;
    }

    if (TextUtils.isEmpty(Username)) {
        editTextUsername.setError("username required");
        return;
    }

    if (!PASSWORD_PATTERN.matcher(password).matches()) {
        editTextPassword.setError("password must contain an uppercase, a special character, and numbers");
        return;
    }

    if (TextUtils.isEmpty(password)) {
        editTextPassword.setError("password required");
        return;
    }

    if (TextUtils.isEmpty(email)) {
        editTextEmail.setError("email required");
        return;
    }
    if (Username.length() < 5) {
        editTextUsername.setError("Username too short");
    }
}

private void createAcc(final String email, String password, final String Username) {
    progressDialog.setMessage("Registering...");
    progressDialog.show();
    //creating a new user
    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    //checking if success
                    if (task.isSuccessful()) {
                        //Uid
                        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                        User user = new User(
                                Username,
                                email);
                        FirebaseDatabase.getInstance().getReference("Users")
                                .child(uid).setValue(user);
                        finish();
                        startActivity(new Intent(SignUpActivity.this, AgeDetailsActivity.class));
                    } else {
                        //display some message here
                        editTextEmail.setError("Email already exists");
                    }
                    progressDialog.dismiss();
                }
            });
}


@Override
public void onClick(View view) {
    if (view == buttonSignup) {
        checkUsername();
    }
  

Комментарии:

1. Мне трудно понять. Можете ли вы объяснить более подробно один за другим?

2. итак, первая часть такова: TextUtils username string проверяет, является ли имя пользователя пустым или оно совпадает с базой данных Firebase, если оно совпадает, оно должно выдать ошибку, часть выборки выполняется, как вы можете видеть, но не возвращает ошибку, она сразу переходит к регистрации нового имени пользователя с другим адресом электронной почты, тогда и только тогда, когда проверка строки завершена, она должна перейти к createUserWithEmailAndPassword , но игнорирует строку проверьте и создайте имя пользователя с дублирующейся записью.

3. Итак, вы помещаете текстовые файлы в onCreate?

4. я отредактировал это и разместил здесь весь метод, кажется, в методе все в порядке, но он по-прежнему не возвращает значение.

Ответ №1:

Я бы хотел, чтобы вы предпочли что-то подобное, попробуйте это.

  private void checkUsername(final String Username) {
        //Check early for the username length
        if (!TextUtils.isEmpty(Username) amp;amp; Username.length() < 5) {
            DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
            final Query UsernameReference = mDatabaseReference.orderByChild("Username").equalTo(Username);
              UsernameReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String usernameExist = dataSnapshot.child("Username").getValue(String.class);

                //If the username not null
                if (usernameExist != null) {
                    //If username exist
                    if (usernameExist.equals(Username)) {
                        editTextUsername.setError("username taken");
                        editTextUsername.requestFocus();
                    } else {
                        //If not exist, proceed here, which mean success

                        //Change to your edit text
                        String email = null;
                        String password = null;
                        createAcc(email, password, Username);
                    }
                }
            }

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

            }
        });
    } else {
        editTextUsername.setError("Username too short");
        editTextSekolah.requestFocus();
    }
}

private void createAcc(final String email, String password, final String Username) {
    progressDialog.setMessage("Registering...");
    progressDialog.show();
    //creating a new user
    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    //checking if success
                    if (task.isSuccessful()) {

                        //Uid
                        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

                        User user = new User(
                                Username,
                                email);
                        FirebaseDatabase.getInstance().getReference("Users")
                                .child(uid).setValue(user);
                        finish();
                        startActivity(new Intent(SignUpActivity.this, AgeDetailsActivity.class));

                    } else {
                        //display some message here
                        editTextEmail.setError("Email already exists");
                    }
                    progressDialog.dismiss();
                }
            });
}
}
  

Комментарии:

1. это не работает, и я вставил весь метод целиком.

2. в процессе выполнения это просто … com.google. firebase.database. Исключение DatabaseException: не удалось преобразовать значение типа java.util. HashMap в строку

3. во-первых, имя пользователя > 5 всегда имеет значение true, поэтому удалил это и проверил, тогда в этой строке отображается строка ошибки usernameExist = DataSnapshot.GetValue(String.class); здесь.

4. @SunnySpilner на самом деле я написал код username < 5 . можете ли вы проверить, каково значение для datasnapshot? поступая следующим образом. String usernameExist = String.valueOf(dataSnapshot.getValue(String.class)); . и добавьте новую строку. Toast.makeText(this, "username: " usernameExist , Toast.LENGTH_SHORT).show; . посмотрите, что произойдет.

5. Имя пользователя существует! = null, всегда равно null, также это выдает мне ту же ошибку при компиляции. «не удалось преобразовать значение типа java.util. HashMap в строку »