У меня есть база данных Firebase с узлом «items», у которого много дочерних элементов, и я хотел бы импортировать список дочерних ключей. Поскольку каждый дочерний элемент содержит довольно много данных, которые меня не интересуют для этой цели, я хотел бы загрузить только дочерние ключи (чтобы минимизировать объем передаваемых данных). Для иллюстрации предположим, что у меня есть следующая структура данных:
Затем я хотел бы получить идентификаторы всех пользователей, например, 5Aoz6ZaB9QS7o9M4lsdbh07VGA02 и т. д. Но без загрузки других пользовательских данных, таких как сообщения, имя, предлагаемые и оценки.
Готово, надеюсь, это проясняет ситуацию.




Чтобы получить идентификаторы этих пользователей, используйте следующий код:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String uid = ds.getKey();
Log.d("TAG", uid);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(valueEventListener);
Результатом будет:
5Aoz6ZaB9QS7o9M4lsdbh07VGA02
// the other ids
Когда вы присоединяете слушателя к определенному узлу, вы получаете все данные ниже этого узла. Так работает база данных Firebase Realtime, и, к сожалению, это поведение нельзя изменить. Но есть обходной путь, в котором вы можете создать еще один отдельный узел, в который вы можете добавить все эти идентификаторы по отдельности. Новый узел должен выглядеть примерно так:
Firebase-root
|
--- userIds
|
--- 5Aoz6ZaB9QS7o9M4lsdbh07VGA02: true
|
--- //other ids
В этом случае, если вы прикрепите слушатель к узлу userIds, вы получите только желаемые данные и ничего более. Код для получения этих идентификаторов аналогичен приведенному выше, но вместо использования .child("users") вам необходимо использовать .child("userIds"). Результат будет таким же.
Если вам нужно другое поведение, вы можете рассмотреть возможность использования Cloud Firestore, где это поведение больше не является проблемой.
Хорошо, спасибо за ответ. Я уже думал, что это невозможно, и это нужно делать с обходом, но не знал наверняка. Теперь я знаю :)
Вы можете использовать параметр shallow=true. Он вернет только первый уровень результатов (ключи), за которым следует true.
Просьба к /users.json?shallow=true
вернет следующее:
{
5Aoz6ZaB9QS7o9M4lsdbh07VGA02: true,
900xwQqVBMOOBUBFbQTeyjwhFsc2: true,
RqwVZgV5cWd1fwkWm2ibuSX0Zfe2: true,
bnDyoXg2sXPJoSAuvdHjkFBLdao2: true,
fitCihcRwYQOpza7nsdawCHJ6Bn1: true,
}
отметиться еще: https://firebase.google.com/docs/database/rest/retrieve-data
Добавьте структуру своей базы данных и укажите, какие ключи вы хотите получить.