Saturday 13 March 2021

addListenerForSingleValueEvent doesn't fire

Trying to check of user logging in exists in database but on first run addListenerForSingleValueEvent does not fire.

private void signInWithPhoneAuthCredentials(PhoneAuthCredential phoneAuthCredential) {    
    FirebaseAuth.getInstance().signInWithCredential(phoneAuthCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful()) {
                //String dbUrl = "https://doctalk-f0b75-default-rtdb.europe-west1.firebasedatabase.app/";
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                if(user!= null){
                    //final DatabaseReference mUserDB = FirebaseDatabase.getInstance().getReferenceFromUrl(dbUrl).child("user").child(user.getUid());
                    final DatabaseReference mUserDB = FirebaseDatabase.getInstance().getReference().child("user").child(user.getUid());
                    Log.v(TAG, mUserDB.toString());

                    mUserDB.addListenerForSingleValueEvent(new ValueEventListener() {
                        String path = mUserDB.getRef().toString();
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                            if (!snapshot.exists()) {
                                Map<String, Object> userMap = new HashMap<>();
                                userMap.put("phone", user.getPhoneNumber());
                                userMap.put("name", user.getDisplayName());
                                mUserDB.updateChildren(userMap);
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError error) { throw error.toException();}
                    });

                    mUserDB.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                            if (!snapshot.exists()) {
                                Map<String, Object> userMap = new HashMap<>();
                                userMap.put("phone", user.getPhoneNumber());
                                userMap.put("name", user.getDisplayName());
                                mUserDB.updateChildren(userMap);
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError error) { throw error.toException(); }
                    });
                }
            }
            userIsLoggedIn();
        }
    });
}

Couldn't figure out why...

UPDATE:

I think there is something related to location and db url.
I'm getting db url = https://app-name-default-rtdb.firebaseio.com/
Where db url on console is https://app-name-default-rtdb.europe-west1.firebasedatabase.app/

And as mention in google docs:

Note: To get a reference to a database other than a us-central1 default dstabase, you must pass the database URL to getInstance() (or Kotlin+KTX database()) . For a us-central1 default database, you can call getInstance() (or database) without arguments.

You can find your Realtime Database URL in the Realtime Database section of the Firebase console. It will have the form https://.firebaseio.com (for us-central1 databases) or https://.firebasedatabase.app (for databases in all other locations).



from addListenerForSingleValueEvent doesn't fire

No comments:

Post a Comment