Приложение для iPhone (iOS), использующее локальный sqlite и желание синхронизировать между несколькими устройствами - PullRequest
12 голосов
/ 05 февраля 2012

У меня есть приложение для iPhone (iOS), которое хранит данные в локальной базе данных SQLite на каждом устройстве. Приложение используется для управления виртуальным банковским счетом для детей, чтобы отслеживать их пособия, расходы, сбережения и т. Д. (KidsBank и KidsBank Free). Я получаю множество запросов от родителей на предоставление возможности синхронизации между родителями и, возможно, даже устройствами iOS их детей.

Я рассмотрел несколько вариантов, но все они утомительны и нетривиальны, поскольку это в основном требует репликации базы данных или новой архитектуры. Любая транзакция на любом устройстве в идеале должна отображаться (синхронизироваться) со всеми устройствами в семействе (как можно скорее).

В идеале, я хотел бы, чтобы синхронизация была автоматической и не включалась

Опции включают (1) Использование iCloud (2) Используйте прямое сетевое соединение между устройствами (Wi-Fi) (3) Использование базы данных и веб-службы на стороне сервера (JSON / RESTFul)

(1) iCloud PRO: iCloud обеспечивает синхронизацию распределенных файлов CON: требуется iOS 5, файлы базы данных SQLite не могут быть синхронизированы через iCloud, классическая репликация базы данных (и нетривиальная)

Использование iCloud является серьезным фактором. Устройства могут записывать собственный журнал транзакций в файл iCloud, где для каждого устройства есть один файл, идентифицируемый уникальным идентификатором устройства. Глобальные уникальные идентификаторы (GID) и отметки времени последнего изменения добавляются в каждую таблицу. Все участвующие устройства будут записывать уникальный идентификатор устройства в отдельный файл в iCloud. После запуска приложения или изменения файла журнала приложение, запущенное на определенном устройстве, загрузит все транзакции, но не те, которые были сгенерированы на их собственном устройстве, из файлов через iCloud. Последнее участвующее устройство для загрузки транзакции удалит транзакцию из файла. Если устройство не является последним участвующим устройством, оно просто подписывает транзакцию и позволяет файлу синхронизироваться через iCloud. Возможно, есть лучшие алгоритмы, но основная идея та же - использование iCloud для просмотра журналов изменений.

(2) Прямое соединение Wi-Fi позволит двум устройствам выполнить sych вручную. PRO: не так сложно управлять процессом синхронизации CON: пользователи должны оба выбрать синхронизацию из своих приложений при подключении по Wi-Fi

(3) Переместить всю базу данных или управлять транзакциями на сервере. PRO: синхронизация больше не требуется CON: Типичные проблемы для веб-приложения. Потребуется переписать слой службы базы данных (в настоящее время в SQL), чтобы использовать удаленный веб-сервис. Стоимость запуска сервера (я бы использовал AWS).

Может ли кто-нибудь предложить некоторый опыт синхронизации SQLite между несколькими устройствами? Я склоняюсь к использованию iCloud для просмотра журналов транзакций. Я пытаюсь минимизировать стоимость и сложность.

Ответы [ 2 ]

3 голосов
/ 08 мая 2012

Переход на iCloud, вероятно, является лучшим решением, так как это доказано и сделано Apple. Вам не нужно сильно беспокоиться о требовании iOS 5, так как согласно большинству статистических данных более 90% используют его. iOS 5 можно бесплатно обновить до. Затем вы можете переименовать старую версию в Lite и продолжить без синхронизации.

Синхронизация, вероятно, одна из самых сложных вещей, которые вы делаете.

Одно из решений, которое я принял, заключается в том, что все изменения в базе данных оставляются в журнале с меткой времени, uniqueid и парой других вещей, чтобы гарантировать, что транзакция является полностью анонимной и абсолютно уникальной. Я сделал чрезвычайно простой веб-сервис, который имеет две операции, вы можете добавить к нему транзакцию, поэтому я синхронизирую каждый раз, когда пользователь подключен к Wi-Fi, поэтому я отправляю все изменения, получаю результат с сервера, а затем удаляю записи транзакций по мере их синхронизируются.

Другим действием является выборка записей, отправка метки времени последней синхронизации, идентификатора пользователя и др.

Все данные отправляются с использованием JSON и принимаются как таковые. Он может легко обслуживать десятки тысяч пользователей на небольшом сервере Amazon EC2.

Примерно так работает iCloud, но я сделал это решение до iCloud. Теперь я собираюсь в iCloud, но, вероятно, нужно, чтобы сервер работал еще 1 год или около того, зависит от использования.

Надеюсь, это поможет вам.

2 голосов
/ 31 октября 2014

Найдя время, чтобы вернуться к работе над приложением, а также по прошествии времени и созревания репликации Core Data iCloud, я преобразовал свое приложение в Core Data (NSSQLiteStoreType) и отслеживал уведомления, такие как persistentStoreDidImportUbiquitousContentChanges. Использование легких миграций тоже. Работает хорошо.

...