Как получить данные из 2 таблиц в Firebase DB Android? - PullRequest
1 голос
/ 16 октября 2019

Вот мой формат БД:

{
  "classes": {
    "class1": {
      "name":"C1"
    },
    "class2": {
      "name":"C2"
    }
  },
  "students": {
    "student1": {
      "name":"S1"
    },
    "student2": {
      "name":"S2"
    }
  },
  "classes_enrollments": {
    "class1": {
      "student1": true,
      "student2": true
    },
    "class2": {
      "student1": true
    }
  },
  "students_enrollments": {
    "student1": {
      "class1": true,
      "class2": true
    },
    "student2": {
      "class1": true
    }
  }
}

Я хочу получить такие данные, как: класс1 с именем C1, имеет 2 учеников S1 и S2

Я пробовал таким образом

database.child("classes_enrolments").addValueEventListener(eventListener);

, но вывод - это просто данные узла classes_enrolments: {class2={student1=true}, class1={student2=true, student1=true}}

Как этого добиться, пожалуйста?

Спасибо

1 Ответ

1 голос
/ 17 октября 2019

Чтобы решить эту проблему, используйте cpde ниже:

String class1 = "class1";
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference nameRef = rootRef.child("classes").child(class1).child("name");
ValueEventListener nameValueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot nameDataSnapshot) {
        String className = nameDataSnapshot.getValue(String.class);
        Log.d(TAG, class1 + " named " + className);

        DatabaseReference class1Ref = rootRef.child("classes_enrollments").child(class1);
        ValueEventListener class1EventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                long numberOfStudent = dataSnapshot.getChildrenCount();
                Log.d(TAG, "has " + numberOfStudent + " students");

                for(DataSnapshot studentDataSnapshot : dataSnapshot.getChildren()) {
                    String student = studentDataSnapshot.getKey();

                    DatabaseReference studentsRef = rootRef.child("students");
                    DatabaseReference studentRef = studentsRef.child(student);
                    ValueEventListener studentsValueEventListener = new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                                String name = ds.child("name").getValue(String.class);
                                Log.d(TAG, name);
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
                        }
                    };
                    studentRef.addListenerForSingleValueEvent(studentsValueEventListener);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
            }
        };
        class1Ref.addListenerForSingleValueEvent(class1EventListener);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
nameRef.addListenerForSingleValueEvent(nameValueEventListener);

Чтобы решить эту проблему, вы должны сначала получить имя класса, запрос, чтобы получить количество студентов и в концечтобы получить имя студентов. Результат в logcat будет:

class1 named C1
has 2 students
S1
S2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...