Синхронизировать / обновить базы данных sqlite - PullRequest
6 голосов
/ 29 февраля 2012

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

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

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

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

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

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

Большое спасибо заранее.

Ответы [ 3 ]

1 голос
/ 07 марта 2012

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

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

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

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

0 голосов
/ 29 февраля 2012

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

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

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

0 голосов
/ 29 февраля 2012

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

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

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