Firebase's exists() function behaving abruptly

Viewed 38

enter image description hereenter image description here

Im using exists() method of the snapshot object in Firebase to check if user exists on pressing the SignUp(register) button. But as soon as I press the button, both the if and else conditions are executed(else first). What is going wrong?

    final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users");

    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            databaseReference.addValueEventListener(new ValueEventListener() {
                public static final String TAG = "user_REG";

                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if(dataSnapshot.child(mobileNumber.getText().toString()).exists()){
                        Log.d(TAG, "onDataChange: if fired");
                    } else {
                        Log.d(TAG, "onDataChange: else fired");
                        if(confirmPass.getText().toString().trim().equals(userPass.getText().toString().trim())){
                            userModel userModel = new userModel(fullName.getText().toString(), userPass.getText().toString());
                            databaseReference.child(mobileNumber.getText().toString()).setValue(userModel);
                            Toast.makeText(user_reg.this, "Successfully Signed Up", Toast.LENGTH_SHORT).show();
                            finish();
                        } else {
                            Toast.makeText(user_reg.this, "Your Passwords do not match", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
1 Answers

First time mobileNumber doesn't exist, So else part is executed and child node value is added and as data is added under same node, onDataChange will fire again and this time, if part will be executed.

To prevent the onDataChange to call twice, Use SingleEventListener instead of ValueEventListener Like this

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
   @Override
   public void onDataChange(DataSnapshot dataSnapshot) {
       String value = (String) dataSnapshot.getValue();
       // do your stuff here with value
   }
   @Override
   public void onCancelled(FirebaseError firebaseError) {
   }
});
Related