DatabaseSnapshot выполняется как if, так и else - PullRequest
0 голосов
/ 15 марта 2020

Я использую Firebase для аутентификации, и в процессе регистрации у меня есть кое-что, чтобы проверить, было ли имя пользователя уже взято из базы данных, которая имеет такую ​​структуру:

Users
  |
  |
  |
  ----userID
        |-----"username"="exampleusername"

Мой код распознает, если имя пользователя уже занят и возвращает сообщение Toast и не создает пользователя, проблема в том, что если имя пользователя не занято, оно также отображает это сообщение, но учетная запись создана. Кто-нибудь знает, что я здесь не так делаю?

public class SignUpActivity extends AppCompatActivity {


    private EditText emailTV, passwordTV, usernameTV, fullnameTV;
    private ImageButton regBtn;
    private ProgressBar progressBar;
    private FirebaseAuth mAuth;
    private static FirebaseAnalytics firebaseAnalytics;
    DatabaseReference reference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_up);

        mAuth = FirebaseAuth.getInstance();

        initializeUI();

        regBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                usernamecheck();
            }
        });
        final TextView signup_button = findViewById(R.id.back_button);
        signup_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
                startActivity(intent);
            }
        });
    }


    private void usernamecheck() {
        String username;
        username = usernameTV.getText().toString();
        DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Users");
        ref.orderByChild("username").equalTo(username).addValueEventListener(new ValueEventListener(){
            @Override
            public void onDataChange(DataSnapshot dataSnapshot){
                if(!dataSnapshot.exists()) {
                    registerNewUser();
                    return;
                }
                else{
                    userexists();
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }

    private void userexists(){
        Toast.makeText(getApplicationContext(), getString(R.string.usernameexists), Toast.LENGTH_LONG).show();
    }

    private void registerNewUser() {
        progressBar.setVisibility(View.VISIBLE);

        String email, password, username, fullname;
        fullname = fullnameTV.getText().toString();
        email = emailTV.getText().toString();
        password = passwordTV.getText().toString();
        username = usernameTV.getText().toString();

        if (TextUtils.isEmpty(fullname)) {
            Toast.makeText(getApplicationContext(), getString(R.string.missingfullname), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            return;
        }
        if (TextUtils.isEmpty(username)) {
            Toast.makeText(getApplicationContext(), getString(R.string.missingusername), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            return;
        }
        if (TextUtils.isEmpty(email)) {
            Toast.makeText(getApplicationContext(), getString(R.string.missingmail), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            return;
        }
        if (TextUtils.isEmpty(password)) {
            Toast.makeText(getApplicationContext(), getString(R.string.missingpassword), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            return;
        }

        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {

                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            String userid = user.getUid();
                            reference = FirebaseDatabase.getInstance().getReference().child("Users").child(userid);

                            HashMap<String, Object> hashMap = new HashMap<>();
                            hashMap.put("id", userid);
                            hashMap.put("username", username.toLowerCase());
                            hashMap.put("fullname", fullname);
                            hashMap.put("bio", "");
                            hashMap.put("imageurl", "https://firebasestorage.googleapis.com/v0/b/frooze-b2248.appspot.com/o/default.png?alt=media&token=aaf52a37-7043-4685-b91f-c6cccda88f4e");
                            reference.setValue(hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()){
                                        // Verification Mail
                                        sendVerificationEmail();
                                        FirebaseAuth.getInstance().signOut();
                                        progressBar.setVisibility(View.GONE);
                                        Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
                                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                                        startActivity(intent);
                                    }
                                }
                            });

                        }
                        else {
                            // If registration fails
                            Toast.makeText(getApplicationContext(), getString(R.string.registrationfail), Toast.LENGTH_LONG).show();
                            progressBar.setVisibility(View.GONE);
                        }
                    }
                });
    }
    public void sendVerificationEmail() {
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        // if User logged in
        if (user != null) {
            // Sends verify Mail
            user.sendEmailVerification()
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                Toast.makeText(getApplicationContext(), getString(R.string.registrationsuccessful), Toast.LENGTH_LONG).show();

                            }
                        }
                    });
        }

    }
    private void initializeUI() {
        fullnameTV = findViewById(R.id.fullname);
        emailTV = findViewById(R.id.email);
        usernameTV = findViewById(R.id.username);
        passwordTV = findViewById(R.id.password);
        regBtn = findViewById(R.id.register);
        progressBar = findViewById(R.id.progressBar);
    }
}

Спасибо.

1 Ответ

2 голосов
/ 15 марта 2020

Вы используете addValueEventListener и onDataChange, что означает, что при добавлении или изменении переменной этот слушатель будет выполняться. addValueEventListener продолжает прослушивать запрос или ссылку на базу данных, к которой он прикреплен.

Если вы хотите один раз, вы должны использовать другого слушателя. Еще один слушатель - addListenerForSingleValueEvent, который выполняет метод onDataChange один раз, а затем прекращает прослушивание ссылки, к которой он присоединен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...