Получить все данные из двух таблиц базы данных Firebase - PullRequest
0 голосов
/ 04 августа 2020

У меня есть две таблицы в базе данных firebase.

Table A :       Table B:

a               a  2 pic
b               b  3 pic
c
d               d  1 pic
e

Результат отображается как:

a  2 pic
b  3 pic
d  1 pic

Мне нужен результат как:

a  2 pic
b  3 pic
c  0 pic
d  1 pic
e  0 pic

Я не могу Как я напишу запрос.

Я пишу запрос, как будто a из таблицы A, равно a в таблице B, затем a покажет с 2 пи c. Таким образом, отображаются a, b и d . Но c и e не отображаются как c и e не равны в таблице B. Я хочу показать c и e с 0 изображениями .

Что пробовал:

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            list = new ArrayList<ListType>();
            list.clear();
            for(DataSnapshot ds:dataSnapshot.getChildren()) {
                ListType listType = ds.getValue(ListType.class);
                final String listname = listType.getName();
                
                databaseReference1.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        for(DataSnapshot postSnapshot:dataSnapshot.getChildren()) {
                           if (postSnapshot.getKey().equals(listname)) {
                                String count = String.valueOf(postSnapshot.getChildrenCount());
                                ListType listTypee = new ListType(listname, count);
                                list.add(listTypee);
                                adapter.notifyDataSetChanged();
                           }
                        }
                    }

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

                    }
                });
            }

1 Ответ

1 голос
/ 05 августа 2020

Теперь вы перебираете все узлы в таблице B и добавляете их счетчики в список. Но поскольку C и E отсутствуют в таблице B, они никогда не появятся в списке.

Я бы фактически инвертировал logi c и:

  1. L oop по результатам чтения таблицы A
  2. Проверьте, есть ли для этого узлы в таблице B
  3. Добавьте либо количество узлов, либо 0

В коде это будет примерно так:

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        list = new ArrayList<ListType>();
        list.clear();
        for(DataSnapshot ds: dataSnapshot.getChildren()) {
            ListType listType = ds.getValue(ListType.class);
            final String listname = listType.getName();
            
            databaseReference1.child(listname).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot bSnapshot) {
                    String count = String.valueOf(bSnapshot.getChildrenCount());
                    ListType listTypee = new ListType(listname, count);
                    list.add(listTypee);
                    adapter.notifyDataSetChanged();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    throw databaseError.toException(); // never ignore errors
                }
            });
        }

Обратите внимание, что отдельные слушатели внутри l oop не так медленны, как вы думаете, поскольку Firebase конвейерирует запросы .

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