Как получить весь объект в Firebase? - PullRequest
0 голосов
/ 17 мая 2018

Я создаю приложение с базой данных Firebase, вот моя структура данных:

{
  "teachers" : {
    "USYSacnOjDR5EAPwljZMHtggN9I2" : {
      "name" : {
        "teacher_name" : "Alison"
      },
      "members": {
        "sIrfMA3bm0R9uj55nDUFpFyabcL2" : true
      }
    }
  },
  "users" : {
    "sIrfMA3bm0R9uj55nDUFpFyabcL2" : {
      "position" : {
        "bpos" : "0"
      },
      "name" : {
        "email" : "m@m.com",
        "name" : "John",
        "surname" : "Clash"
      }
    }

Так что теперь в RecyclerView я пытаюсь отобразить всех Alison членов учителя, как вы можете видеть John Clash установлен на true.В любом случае, когда я пытаюсь получить пользователя таким образом:

    reference = FirebaseDatabase.getInstance().getReference("teachers").child(teacherkey).child("members");
reference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                User user = dataSnapshot.child("name").getValue(User.class);
                result.add(user);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                User user = dataSnapshot.child("name").getValue(User.class);
                result.remove(user);
                adapter.notifyDataSetChanged();
            }

сбой приложения из-за NPE, ключ datasnapshot действителен, это ключ учетной записи Джона, но значение снимка равно true.Как я могу решить это и получить из данных Джона name и surname?

@ Редактировать: Вот мой код извлечения:

 public void updateList() {
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    String userId = ds.getKey();
                    DatabaseReference userIdRef = FirebaseDatabase.getInstance().getReference().child("users").child(userId);
                    userIdRef.addChildEventListener(new ChildEventListener() {
                        @Override
                        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                            User user = dataSnapshot.child("name").getValue(User.class);
                            result.add(user);
                            adapter.notifyDataSetChanged();

                        }

                        @Override
                        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                        }

                        @Override
                        public void onChildRemoved(DataSnapshot dataSnapshot) {

                        }

                        @Override
                        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

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

            }
        });
    }

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Чтобы решить эту проблему, вам нужно запросить базу данных дважды.Пожалуйста, смотрите код ниже:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference membersRef = rootRef.child(teachers).child(teacherId).child("members");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String userId = ds.key();

            DatabaseReference userIdRef = rootRef.child("users").child(userId);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    User user = dataSnapshot.getValue(User.class);
                    Log.d("TAG", user.getName());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            userIdRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
membersRef.addListenerForSingleValueEvent(valueEventListener);
0 голосов
/ 17 мая 2018

У вас есть 2 подхода для решения этой проблемы:

a.) Внутри onChildAdded у вас уже есть, если полученное вами значение равно true, выполните другой поиск в базе данных, но на этот раз в узле «пользователи».Что-то вроде

newReference = FirebaseDatabase.getInstance().getReference("users").child(dataSnapshot.getKey).child("name")

b.) В узле «members» напишите «John Clash» вместо «true».Этот подход пока работает, но вы попадете в первый подход, если когда-нибудь вам понадобится также получить адрес электронной почты

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