Firebase замедляется при подсчете товаров из базы данных (Android) - PullRequest
0 голосов
/ 31 октября 2018

У меня есть база спортивных товаров. Пользователи могут добавлять столько продуктов, сколько они хотят, при условии, что они правильные и одобрены администратором. Все работает нормально, но в прошлом месяце я проверил приложение, и оно начало работать очень медленно. Я проверил это на реальном устройстве, а также в эмуляторе. Такое же поведение Я думаю, что проблема в том, что количество продуктов постоянно растет, а подсчитывать продукты еще сложнее. Может кто-нибудь помочь мне решить эту проблему? Спасибо!

Код:

FirebaseDatabase.getInstance().getReference("sport_products").addListenerForSingleValueEvent(
        new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                int productCount = (int) dataSnapshot.getChildrenCount();

                for(DataSnapshot productSnapshot : dataSnapshot.getChildren()) {

                    //Code to process the data

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError de) {}
        }
);

1 Ответ

0 голосов
/ 31 октября 2018

Это зависит от того, сколько данных (продуктов) у вас под узлом sport_products и какая пропускная способность у вас на устройстве, на котором вы их извлекаете.

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

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

Firebase-root
    |
    --- productCounter: 500
    |
    --- sport_products
           |
           --- productId
                 |
                 --- //Product details

Вы можете добавить счетчик прямо под корнем базы данных. Чтобы получить счетчик, просто присоедините слушатель к свойству productCounter и получите значение из объекта DataSnapshot. Поскольку вы можете использовать это приложение в многопользовательской среде, я рекомендую вам увеличить / уменьшить счетчик, используя Транзакция Firebase , как объяснено в моем ответе из этого поста .

Edit:

Методы, отличные от ChildEventListener, будут запускаться на отдельных дочерних узлах и не несут знания о полном результате. Единственный способ получить счетчик продуктов вашего узла sport_products - это сохранить свой собственный счетчик в коде, увеличить его в методе onChildAdded() и уменьшить его в методе onChildRemoved(). Это дает вам счетчик того, сколько детей ваш клиентский код уже обработал.

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