Синхронизировать / обновлять базы данных sqlite

У нас есть приложение для Android и приложение для iPhone (та же функциональность), которые используют sqlite для локального хранения данных. Первоначально приложения не имеют данных, затем в первом запуске они получают данные с удаленного сервера и сохраняют их в базе данных sqlite. База данных sqlite создается сервером, и приложения загружают его как один файл, который затем используется для покупки приложений. Файл базы данных не очень велик по сегодняшним стандартам, но не крошечный – около 5-6 МБ.

Теперь время от времени приложения должны обновлять данные с сервера. Есть несколько подходов, о которых я могу думать:

  1. Загрузите новую полную базу данных с сервера и замените существующую. Это звучит как самый простой способ справиться с проблемой, если бы не повторные загрузки 5-6 МБ. Приложения сообщают пользователю, хотят ли они загружать обновления, поэтому это может быть не слишком проблематично.

  2. Загрузите базу данных дельты с сервера, содержащую только новые / измененные записи и в некоторой форме информацию о том, какие записи удалить. Это приведет к значительно меньшему размеру загрузки, но работа на стороне клиента будет более сложной. Мне нужно будет прочитать одну базу данных и, в зависимости от того, что прочитано, обновить другую. Насколько мне известно, с sqlite нет способа сделать что-то вроде insert into db1.table1 (select * from db2.table1) где db1 и db2 – это две базы данных sqlite, содержащие table1 1 той же структуры. (Полная база данных sqlite содержит около 10 таблиц с самым большим, вероятно, содержащим около 500 записей или около того).

  3. Загрузите delta данных в другом формате (json, xml и т. Д.) И используйте эту информацию для обновления базы данных в приложении. То же, что и раньше: не большая проблема на стороне сервера, меньший размер загрузки, чем полная база данных, но довольно болезненный процесс для обновления.

Какой из трех подходов вы рекомендуете? Или, может быть, есть еще один способ, который я пропустил?

Спасибо заранее.

Есть ли способ, которым вы можете иметь поле JSON для каждой из таблиц? Например, если у вас есть таблица с именем users, у вас есть столбец с именем «json», который хранит JSON для каждого из пользователей. По сути, он будет содержать информацию, оставленную в остальных полях.

Поэтому, когда вы загружаете дельта в JSON, все, что вам нужно сделать, это вставить JSON в таблицы.

Разумеется, с помощью этого метода вам потребуется выполнить дополнительную работу по разбору JSON и созданию модели / объекта, но это всего лишь дополнительные 3-4 небольших шага.

После многих соображений и попыток и ошибок я пошел на комбинацию опций (2) и (3).

  1. Если данных вообще нет, приложение загружает полный файл базы данных с сервера.

  2. Если данные присутствуют и требуется обновление, приложение загружает некоторую базу данных с сервера. И проверяет содержимое определенного значения в конкретной таблице. В этом значении указывается, должна ли новая база данных заменять оригинал или содержит ли она удаления / обновления / вставки

Это оказывается самым быстрым способом (с точки зрения производительности) и оставляет весь тяжелый подъем (определяющий, нужно ли все вносить в одну базу данных или просто обновление) на сервер. Кроме того, при таком подходе, если мне нужно изменить алгоритм, скажем, всегда загружать полную базу данных, это будет только изменение на сервере без необходимости повторной компиляции и повторного распространения приложения.

Я порекомендую подход 3, потому что приложение будет загружать json-файл быстрее, а локальный db будет обновляться легче, избегая лишних расходов на использование в Интернете.

Просто создайте пустой db изначально в соответствии с сервером db, а затем регулярно обновляйте его, извлекая json

Intereting Posts
Android X86 на vmware, Google Play требует Wi-Fi AOSP Не загружайтесь на молот Создание карты с SD-карты для установки в качестве фона в android Динамически добавленные строки таблицы не отображаются Как скрыть время, полученное от ответа, с сервера в андроиде, не показывая черный экран? Что мне нужно добавить в макет, чтобы скрыть заголовок? Внешний HTML-ресурс, не связанный с React Native в сборке для использования Webview Использование LayoutInflater с использованием контекста Невозможно правильно вставить греческие символы в базу данных mysql Android webview, запускайте действие ACTION_VIEW, когда URL-адрес не может обрабатываться webview Как получить идентификатор приложения Android? Производительность Android NDK по сравнению с обычным Java-кодом Синтаксис Sqlite Delete Query в Android Android: ошибка кучи, импортирующая ShowcaseView как проект, ClassNotFound, если в качестве JAR, вне памяти Как Android решает, какую папку макета использовать?