Моя основная цель обеспечения сохранения - это уменьшить потребление полосы пропускания.
Цель сохранения диска - позволить приложению запускаться и запускаться, даже если у пользователя нет целое rnet соединение. Хотя постоянство диска может также сократить некоторые загрузки данных, это не гарантируется и не является его основным назначением.
Чтобы уменьшить потребление пропускной способности, вам следует читать меньше данных. Вызов keepSynced(true)
на узле будет поддерживать этот узел в syn c до тех пор, пока приложение активно. Если узел регулярно меняется, и вам нужны данные только время от времени, это почти гарантированно приведет к потере пропускной способности. Здесь также цель синхронизации узла состоит не в том, чтобы уменьшить использование полосы пропускания, а в том, чтобы сохранить эти данные "fre sh" в случае, если они необходимы, когда пользователь не подключен.
К вашим вопросам:
- Согласно [документации], прослушивателя ValueEvent должно быть достаточно для кэширования данных, почему он не работает в моем случае?
Это невозможно точно сказать, почему данные не кэшируются. Но если ваш onDataChange
не вызывается, можно с уверенностью предположить, что данные также не будут записаны в кэш диска.
Первый шаг к устранению неполадок состоит в реализации onCancelled
, что вам следует никогда оставить пустым. Его минимальная реализация:
override fun onCancelled(p0: DatabaseError) {
throw p0.toException();
}
Будет ли эта синхронизация истинно увеличивать потребление пропускной способности, поскольку она постоянно проверяет наличие обновлений? Будет ли эта синхронизация выполняться верно, даже если моя активность будет уничтожена?
Когда Вы звоните ref.keepSynced(true)
, он подключает пустой слушатель к ref
. Это означает, что данные в ref
будут постоянно обновляться в памяти (и если вы включите постоянство диска в кеше) в течение всего времени, пока приложение работает.
Как уже говорилось ранее, если данные часто обновляются и используются нечасто, это может в конечном итоге использовать большую полосу пропускания, чем простое подключение прослушивателя, когда это необходимо. Как уже говорилось ранее: вы должны вызывать ref.keepSynced(true)
, когда вам нужно, чтобы данные узла были свободными sh.
Невозможно сказать для каждого сценария, какое влияние оказывает синхронизация узла на использование полосы пропускания. , Вам придется измерить и экстраполировать на основе понимания того, что на самом деле делает каждый API, и для чего он предназначен.
Если я установлю keepynced true для ссылки на мою базу данных, размер которой составляет 100 КБ, если внутри моей ссылки происходит дочернее обновление, которое будет изменено на 1 КБ. Будут ли загружены эти 100 КБ в следующий раз или только 1 КБ?
Ни то, ни другое. В этом случае Firebase выполняет так называемый delta syn c. SDK вычисляет список хэшей для локальных данных и отправляет их на сервер. Сервер сравнивает их со своими собственными хешами, а затем отправляет обратно только те данные, которые изменились. Результат, как правило, должен быть меньше, чем отправка обратно всего снимка, но насколько меньше, зависит от того, сколько данных в местоположении и сколько было изменено.
Также см .: