Как получить детские ключи от Firebase, не загружая их детей?

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

Как получить детские ключи от Firebase, не загружая их детей?

Затем я хотел бы получить идентификаторы всех пользователей, например, 5Aoz6ZaB9QS7o9M4lsdbh07VGA02 и т. д. Но без загрузки других пользовательских данных, таких как сообщения, имя, предлагаемые и оценки.

Добавьте структуру своей базы данных и укажите, какие ключи вы хотите получить.

Alex Mamo 02.05.2018 14:20

Готово, надеюсь, это проясняет ситуацию.

BramH 02.05.2018 20:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
1 671
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы получить идентификаторы этих пользователей, используйте следующий код:

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, где это поведение больше не является проблемой.

Хорошо, спасибо за ответ. Я уже думал, что это невозможно, и это нужно делать с обходом, но не знал наверняка. Теперь я знаю :)

BramH 02.05.2018 22:24

Вы можете использовать параметр 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

Другие вопросы по теме