Подкаталог чтения Firebase в каждой записи

Как мне получить список всех элементов «Этаж» в моей базе данных. Если я использую следующую базу данных, в моем списке должно быть 3 элемента. Список должен содержать элементы с идентификаторами 1234, 4321, 2341.

 mydatabase
    -buildings
     --LNBxRoNBhVZyXniqe9t
      ---checked
      ---anzI
      ---anzA
      ---floors
       ----f1
        -----1234
         ------description
         ------id
       ----f2
        -----4321
         ------description
         ------id

     --LXdsafRfasdf12asdfJ
      ---checked
      ---anzI
      ---anzA
      ---floors
       ----f1
        -----2341
         ------description
         ------id

This is my DAO:

     private FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("buildings");
    @Override
    public void initialize() {
        myRef.addListenerForSingleValueEvent(new ValueEventListener() {
        List<Floors> list = new LinkedList<>();

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                        ????
                       }

          @Override
          public void onCancelled(DatabaseError error) {
          Log.w(TAG, "Failed to read value.", error.toException());
           }});

у вас есть решение @khaled_bhar?

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

Ответы 2

Вам нужно будет пройти через DataSnapshot, который вы получаете от Firebase. Что-то вроде этого

myRef.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot buildingSnapshot: dataSnapshot.getChildren()) {
      for (DataSnapshot floorSnapshot: buildingSnapshot.child("floors").getChildren()) {
        for (DataSnapshot numberSnapshot: floorSnapshot.getChildren()) {
          Log.i(TAG, numberSnapshot.getKey()); // "1234", "4321", "2341"
          Log.i(TAG, ""+numberSnapshot.child("id").getValue());
        }          
      }
    }
  }

  @Override
  public void onCancelled(DatabaseError error) {
    Log.w(TAG, "Failed to read value.", error.toException());
  }
});

@AlexMamo: спасибо за редактирование, но я намеренно оставил String.class выключенным, так как вопрос не показывает тип данных для свойства id.

Frank van Puffelen 01.10.2018 20:04

Будучи идентификатором, я предполагал, что свойство имеет тип String, но вы правы, это может быть объект любого типа. Прости за это.

Alex Mamo 01.10.2018 20:20

Первоначально у меня был String.class, но затем я заметил, что все ключи в вопросе были числовыми (конечно, сохраненными как String, потому что ключи по определению являются строками).

Frank van Puffelen 01.10.2018 20:22

Если бы свойство id было типа number, конкатенация работает отлично, тогда как передача String.class методу getValue() вызовет исключение, подобное этому: Failed to convert value of type java.lang.Long to String. Спасибо!

Alex Mamo 01.10.2018 20:39
Ответ принят как подходящий

How can I get a list of all "Floor" elements in my Database?

Очень просто, трижды повторяя базу данных с помощью метода getChildren().

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference buildingsRef = rootRef.child("buildings");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
            for(DataSnapshot ds : dSnapshot.child("floors").getChildren()) {
                for(DataSnapshot d : ds.getChildren()) {
                    String key = d.getKey();
                    String description = d.child("description").getValue(String.class);
                    list.add(key);
                    Log.d("TAG", key);
                }
            }
        }

        //Do what you need to do with your list
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage());
    }
};
buildingsRef.addListenerForSingleValueEvent(valueEventListener);

List should contain the elements with the id's 1234, 4321, 2341

Список будет содержать именно эти три идентификатора. Если вы попытаетесь распечатать список в своем журнале регистрации, результат будет следующим:

[1234, 4321, 2341]

если мне нужно значение описания, я просто делаю d.child ("description"). getValue () или?

Luki99 01.10.2018 18:43

Чтобы получить description, см. Мой обновленный ответ.

Alex Mamo 01.10.2018 18:45

Пожалуйста! Если вы считаете, что мой ответ вам помог, примите его, нажав на галочку (✔️) слева под стрелками голосования. Должен поменять цвет на зеленый. Я бы оценил это. Спасибо!

Alex Mamo 01.10.2018 18:57

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