addListenerForSingleValueEvent не срабатывает

Попытка проверить вход пользователя в систему существует в базе данных, но при первом запуске addListenerForSingleValueEvent не срабатывает.

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();
        }
    });
}

Не мог понять почему...

ОБНОВЛЕНИЕ:

Я думаю, что есть что-то, связанное с местоположением и URL-адресом БД.
Я получаю URL-адрес БД = https://app-name-default-rtdb.firebaseio.com/
Где URL-адрес БД на консоли https://app-name-default-rtdb.europe-west1.firebasedatabase.app/

Как указано в документах Google:

Примечание. Чтобы получить ссылку на базу данных, отличную от dstabase по умолчанию us-central1, вы должны передать URL-адрес базы данных в getInstance() (или базу данных Kotlin+KTX()). Для базы данных us-central1 по умолчанию вы можете вызвать getInstance() (или базу данных) без аргументов.

Вы можете найти URL-адрес своей базы данных в реальном времени в разделе «База данных в реальном времени» консоли Firebase. Он будет иметь форму https://.firebaseio.com (для баз данных us-central1) или https://.firebasedatabase.app (для баз данных во всех других местах).


person Jadeye    schedule 08.03.2021    source источник
comment
Первый шаг — перестать игнорировать возможные ошибки и внедрить onCancelled. Как минимум это должно быть public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); }.   -  person Frank van Puffelen    schedule 08.03.2021
comment
Как упомянул Франк ван Паффелен в своем комментарии, если вы попытаетесь зарегистрировать ошибку базы данных, будет ли что-то распечатано в логарифме?   -  person Alex Mamo    schedule 09.03.2021
comment
Я добавил throw error.toException();, но в логарифме ничего не печатается. При отладке кажется, что прослушиватели создаются, но пропускаются... Я не понимаю, почему пользователь создается в Authentication, но не вставляется в БД???   -  person Jadeye    schedule 09.03.2021


Ответы (2)


Возможно, ваш:

Пользователь FirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

а также

final DatabaseReference mUserDB = FirebaseDatabase.getInstance().getReference().child(user).child(user.getUid());

это неправильно принято

person nykS    schedule 09.03.2021
comment
Я получаю пользователя от mUserDB, поэтому я предполагаю, что он подключается при аутентификации. Единственное, что мне кажется странным, это то, что path указывает на https://app-name-default-rtdb.firebaseio.com, где, как говорится в документах Google, указывает на конкретное место, в котором он был создан. - person Jadeye; 09.03.2021

База данных Firebase Realtime теперь имеет два местоположения.

  1. US
  2. Бельгия

URL-адрес базы данных США является старым, а URL-адрес Бельгии содержит дополнительный узел. Если ваша консоль firebase содержит URL-адрес Бельгии, это означает, что вы создали экземпляр базы данных в Бельгии. Поэтому повторно загрузите файл JSON служб Google и используйте его.

person Harish Kumar R    schedule 19.03.2021
comment
совсем не то. Извините. - person Jadeye; 22.03.2021