вариант1: полный update
имеется файлик, где все данные лежат - по событиям (временные интеревалы или каждый запуск проги) этот файлик сравнивается с серверным по по htpp-заголовкам Last-Modified: Content-Length: ETag: или что подобное и в случае отличий с локальными файл полностью перезакачивается.
плюс - все есть в http и в стандартных прогах (тот же "curl -z", "wget -N")
минус - при каждом обновлении надо качать весь файл.
вариант2: дифференциальное обновление
в файле есть строчка версии файла, периодически эта версия сравнивется с серверной и если есть отличия, то заправшивается дифф между локальной и серверной версией. после чего дифф применяется к локальному файлу и он обновляется до серверной.
плюсы: надо качать только отличия
минус: протокол сложнее - либо свое колхозить и отлаживать, либо прикручивать библиотеку управления версиями.
вариант3: нечто среднее
данные лежат в двух файлах: основном и дополнительном, данные прогой читаются из обоих и используются равноценно.
основной большой и очень редко обновлемый (раз в месяц и больше), дополнительный содержит только обновления относительно основного и полностью перезакачивается при каждом обновлении (по вар.1) но т.к. обновлений мало, то его объем не велик.
плюсы: см вар.1
минусы: небольшое усложнение в чтении данных.
если данные удаляются, то необходима функция, исключающая из основного, данные помеченные в дополнительном как удаленные.
так работает osmand live к примеру.
примерные варианты навскидку.