База данных Firebase Realtime - чтение вложенных данных - PullRequest
0 голосов
/ 11 ноября 2018

Я делаю проект с firebase, могу сохранить некоторые записи в базе данных, но получение его было проблемой для меня, я вмешивался в другие посты из SO, но они не работали для меня. Вот так выглядит база данных (пример):

enter image description here

И мой код для извлечения данных:

private void readDataFromDB() {
    databaseReference.child("users").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user = new User();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                user.setStrName(//Get the Name of the user);
                user.setStrScore(//Get the Score of the user));
            }
        }

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

        }
    });
}

Класс пользователя:

public class User {
  String strName, strScore;

  public String getStrName() {
      return strName;
  }

  public void setStrName(String strName) {
      this.strName = strName;
  }

  public String getStrScore() {
      return strScore;
  }

  public void setStrScore(String strScore) {
      this.strScore = strScore;
  }
}

Как я могу получить имя и оценку от каждого конкретного пользователя

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вместо создания профиля в каждом узле вы можете использовать глобальный узел профиля и хранить в нем данные профиля с их UID, что облегчит вам выборку сведений об одном пользователе.

-profile
  -UID1
    -name
    -score
  -UID2
    -name
    -score

При получении вы можете использовать getCurrentUser.getUid () для извлечения данных для каждого пользователя:

 String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
databaseReference.child("users").child("profile").child(uid).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        User user = new User();

           user = dataSnapshot.getValue(User.class);

    }

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

    }
});
0 голосов
/ 11 ноября 2018

В вашем коде вы устанавливаете значения, вам нужно извлекать значения с помощью геттеров.

Попробуйте следующее:

databaseReference.child("users").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user    = dataSnapshot.getValue(User.class);
            String name  = user.getStrName();
            String score = user.getStrScore();
    }

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

    }
});

Но сначала вам нужно добавить значенияк примеру с базой данных:

User user = new User();
user.setStrName("my_name");
user.setStrScore("20");

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users");
ref.push().setValue(user);

Примечание setValue():

Кроме того, вы можете устанавливать собственные экземплярыКласс в этом месте, при условии, что они удовлетворяют следующим ограничениям:

  1. Класс должен иметь конструктор по умолчанию, который не принимает аргументов
  2. Класс должен определять публичные методы получения для назначаемых свойств,Для свойств без общедоступного метода получения будет установлено значение по умолчанию при десериализации экземпляра

Вам необходимо добавить конструктор по умолчанию в класс POJO public User(){}, а также имена полей вкласс должен совпадать с теми, что в базе данных.Так что замените String strName, strScore; на String name, score; и сгенерируйте геттеры и сеттеры снова.

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