Как мне считывать значения из базы данных firebase в реальном времени для вложенных родительских узлов через классы POJO?

#java #android #firebase #firebase-realtime-database

#java #Android #firebase #firebase-realtime-database

Вопрос:

Вот моя база данных:

введите описание изображения здесь

Я хочу получить данные из stats.20201104.nutrients.protein, которых должно быть 2.

Для всех других узлов над ним я смог довольно хорошо извлекать данные с помощью пользовательской настройки класса POJO. Кажется, я не могу найти способ получить значения даты, например, 20201104, в общем, в журнале выполнения указано следующее, что ожидается:

В классе com.example.nutrobud.ui.home не найден параметр / поле для 20201104.Статистика

Я знаю свой Stats.java класс настроен неправильно, как я могу настроить это так, чтобы я по-прежнему поддерживал ту же иерархию узлов БД?

Вот мой пользовательский класс из User.java:

 public class User {
    private String email;
    private String password;
    private String firstName;
    private String secondName;
    private int age;
    private String gender;
    private int weight;
    private List<String> ingredientsNo;
    private List<String> ingredientsYes;
    private List<Integer> ingredientsYesGoalsQty;
    private List<Integer> ingredientsYesTrackedQty;
    private int calorieGoalsQty;
    private int calorieTrackedQty;
    private Stats stats;

    //constructors

    //basic getter and setters for all data members
}
  

Stats.java , тот же каталог, что и User.java:

 public class Stats {
    private int caloriesTracked;
    private HashMap<String, Integer> nutrients;
    //constructors
    
    //basic getter and setters for all data members
}
  

Функция для чтения данных из базы данных в activity:

 db.child("users").addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot snapshot: dataSnapshot.getChildren()){
                        User user = snapshot.getValue(User.class);
                        //do something with user
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
  

Ответ №1:

Вы близки, но прямо сейчас у вас нет ничего в ваших POJOs, фиксирующих 20201104 то, что упоминается в сообщении об ошибке. Поскольку вы не можете знать фактические ключи, они должны быть map .

Поэтому я думаю, что ваш:

 private Stats stats;
  

На самом деле должно быть:

 private Map<String, Stats> stats;