Получить список предметов / детей из базы данных Firebase? - PullRequest
0 голосов
/ 30 августа 2018

У меня возникли проблемы с выяснением того, как получить количество элементов / дочерних элементов в моей базе данных Firebase в реальном времени, чтобы мое приложение могло использовать его в качестве значения int .

Проверьте изображение ниже:

enter image description here

Итак, как вы можете видеть выше, у меня есть 2 ребенка из images_list .

Что я хочу сделать, это : получить количество элементов / дочерних элементов images_list , возвращаемых в мое приложение, которое, очевидно, изначально будет равно 2, и будет увеличивать это число всякий раз, когда я добавить больше предметов / детей.

Итак, мой вопрос: Какой код я реализую, чтобы получить количество детей в этой базе данных ? И как я мог тогда преобразовать это число в значение int? Я уже экспериментировал с разными методами, но пока не нашел решения.

Надеюсь, это имело смысл. Большое спасибо за любую вашу помощь!


Кодовое решение здесь; Мне пришлось переместить большую часть этого кода из моего адаптера RecyclerView в мой MainActivity, чтобы он работал

Интерфейс

public interface FirebaseCallback {
    void onCallback(List<String> list);
}

метод readData

private void readData(final FirebaseCallback firebaseCallback) {
    mDatabaseImagesRef = FirebaseDatabase.getInstance().getReference("images_list");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String imageItems = ds.getValue(String.class);
                imageList.add(imageItems);
            }

            firebaseCallback.onCallback(imageList);
            Log.i("imageList.size() is: ", String.valueOf(imageList.size()));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.i(LOG_TAG, databaseError.getMessage());
        }
    };
    mDatabaseImagesRef.addListenerForSingleValueEvent(valueEventListener);
}

вызывается onCreate()

readData(new FirebaseCallback() {
        @Override
        public void onCallback(List<String> list) {
            mImageAdapter.notifyDataSetChanged();
        }
    });

getItemCount () в RecyclerViewAdapter

@Override
public int getItemCount() {
    return imagesList.size();
}

Ответы [ 4 ]

0 голосов
/ 31 августа 2018

Попробуйте этот код:

public void onDataChange(@NonNull DataSnapshot snap) {
        int count = (int) snap.getChildrenCount();
        //shows the number of items
}
0 голосов
/ 30 августа 2018
mRef= FirebaseDatabase.getInstance().getReference("images_list");

в вашем методе "onDataChange" внутри слушателя, используйте getChildrenCount (), чтобы получить количество изображений, вы можете перебрать эти дочерние элементы, используя цикл i, Exmeple:

mRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    int count = dataSnapshot.getChildrenCount();
                   // here you get your images number

                  for(DataSnapshot ds : dataSnapshot.getChildren()) {
                      String key = ds.getKey()
                      // and here you get the key
                   }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
0 голосов
/ 30 августа 2018

Чтобы подсчитать все дочерние элементы под узлом images_list, используйте следующие строки кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference imagesListRef = rootRef.child("images_list");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        int count = (int) dataSnapshot.getChildrenCount(); //Cast long to int
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
imagesListRef.addListenerForSingleValueEvent(valueEventListener);

как мне тогда преобразовать это число в значение типа int?

Согласно официальной документации, метод getChildrenCount () возвращает long, а не и int. Поэтому вам нужно привести этот длинный примитив к int.

как извлечь счетчик из этого блока кода, чтобы на него можно было ссылаться и использовать и вне этого кода?

Вы не можете просто создать переменную count как глобальную переменную и использовать ее вне метода onDataChange(), поскольку она всегда будет 0 из-за асинхронного поведения этого метода. Это означает, что если попытаться использовать его результат вне этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны. Другими словами, ваш count всегда будет 0.

Быстрое решение этой проблемы - использовать значение вашей переменной count только внутри метода onDataChange(), в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого сообщения , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

0 голосов
/ 30 августа 2018

попробуйте

userReference = FirebaseDatabase.getInstance().getReference("images_list");
userReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    num = dataSnapshot.getChildrenCount();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

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