Слушатель onChildAdded
вызывается огромное количество раз для каждого ребенка в этом корне.
Как вы уже упоминали и как говорится в документации, это ожидаемое поведение. Обычно не рекомендуется прикреплять ChildEventListener
к узлу (корневому узлу), который содержит огромное количество данных. Пожалуйста, будьте осторожны с этой практикой, потому что при загрузке большого количества данных вы можете получить ошибки вроде: OutOfMemoryError . Это происходит потому, что вы неявно загружаете весь прослушиваемый узел, а также все данные под ним. Эти данные могут быть представлены как простые свойства или как сложные объекты. Так что это можно считать пустой тратой ресурсов и пропускной способности. В этом случае наилучшим подходом является выравнивание базы данных в максимально возможной степени. Если вы новичок в базах данных NoSQL, эта практика называется денормализация и является обычной практикой, когда дело доходит до Firebase. Для лучшего понимания я рекомендую вам взглянуть на:
Обратите также внимание, что при дублировании данных необходимо учитывать одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.
Я также рекомендую вам увидеть последнюю часть моего ответа из следующего поста:
Это для Cloud Firestore, но те же правила применяются к базе данных Firebase в реальном времени.
Но потом я потерял свои возможности CRUD, потому что он слушает новые записи, а не все.
Все в Firebase касается слушателей. Вы не можете получать обновления в реальном времени для объектов в узле, если вы не слушаете их. Таким образом, вы не можете ограничивать результаты и ожидать получения обновлений от объектов, которые вы не слушаете. Если вам нужно получать обновления для всех объектов в узле, вам необходимо прослушать их все. Поскольку этот подход вообще не практичен, вы можете использовать денормализацию , как описано выше, или ограничить результаты с помощью запросов, которые могут помочь вам ограничить объем данных, которые вы получаете из базы данных. Что касается ваших решений, второе предпочтительнее, но вы также можете рассмотреть другой подход, который заключается в загрузке данных в меньших кусках в соответствии со свойством timestamp
или в соответствии с любым другим необходимым свойством.
Редактировать: Согласно вашему комментарию:
Можете ли вы предоставить тесты для каждого решения (1.denormalization, 2.my solution), исследовать использование полосы пропускания и ресурсов, и какое из них действительно предпочтительнее?
Все данные смоделированы, чтобы разрешить варианты использования, которые требуются приложению. К сожалению, я не могу делать тесты, потому что это действительно зависит от варианта использования приложения и количества данных, которые оно содержит. Это означает, что того, что работает для одного приложения, может быть недостаточно для другого приложения. Таким образом, тесты могут не быть правильными для всех. Процесс денормализации или ваше решение полностью зависит от того, как вы собираетесь запрашивать базу данных. В приведенном выше списке я добавил новый ресурс, который является моим ответом относительно техники денормализации в базах данных NoSQL . Надеюсь, что это также поможет посетителям.