Как связать между аутентифицированными пользователями и базой данных в Firebase?

У меня есть Firebase Authentication в моем приложении для Android. Мой вопрос заключается в том, как я связываюсь между аутентифицированными пользователями (которые отображаются на вкладке Firebase::Auth в консоли Firebase) и в базе данных (вкладка Firebase::Database).

Мне нужно связать данные в базе данных с соответствующим пользователем в Auth с помощью User UID, который появляется в Auth, и в конечном итоге отправить запросы о конкретном UID, чтобы получить соответствующую информацию в Database.

Есть ли что-то автоматическое/встроенное, что делает это или я должен создать новую запись для пользователя в Database каждый раз, когда я аутентифицирую пользователя, а затем создаю для него поле идентификатора с отображаемым значением UID в Auth?

В Документах по управлению пользователями объясняется только добавление пользователей на вкладку Auth и сброс их паролей.

Ответ 1

После аутентификации создайте дочерний элемент с идентификатором UID, заданным Firebase, и установите его значение для своего пользовательского класса:

//get firebase user
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

//get reference
DatabaseReference ref = FirebaseDatabase.getInstance().getReference(USERS_TABLE);

//build child
ref.child(user.getUid()).setValue(user_class);

USERS_TABLE является прямым потомком root.

Затем, когда вы хотите получить данные, получите ссылку на пользователя по его UID, слушайте addListenerForSingleValueEvent() (вызывается только один раз) и перебираете результат с отражением:

//get firebase user
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

//get reference
DatabaseReference ref = FirebaseDatabase.getInstance().getReference(USERS_TABLE).child(user.getUid());
//IMPORTANT: .getReference(user.getUid()) will not work although user.getUid() is unique. You need a full path!

//grab info
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        final Profile tempProfile = new Profile(); //this is my user_class Class
        final Field[] fields = tempProfile.getClass().getDeclaredFields();
        for(Field field : fields){
            Log.i(TAG, field.getName() + ": " + dataSnapshot.child(field.getName()).getValue());
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

изменить

Или без отражения:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    final Profile p = dataSnapshot.getValue(Profile.class);
}