Облачная синхронизация между приложением iPad / iPhone

У меня есть приложение Core Data, которое в конечном итоге станет универсальным приложением для iPhone / iPad.

Я хотел бы реализовать облачную синхронизацию, чтобы iPhone и iPad, на которых запущено приложение, могли обмениваться данными. Я планирую использовать недавно выпущенный Dropbox API. Есть ли у кого-нибудь мысли о том, как лучше всего это сделать? Dropbox API позволяет приложениям хранить файлы в облаке. Я думал о том, чтобы изначально сохранить базу данных (sqlite) для приложения в облаке, а затем загрузить эту базу данных, но затем я понял, что использование этого метода чрезвычайно затруднит объединение изменений (а не замену всей базы данных).

Любые мысли приветствуются. Спасибо.


person indragie    schedule 02.06.2010    source источник


Ответы (4)


Если вам это удастся, самый простой способ выполнить синхронизацию (безусловно) - иметь три копии ваших данных локально: последняя загруженная вами копия («старая»), копия, созданная локальные изменения («мои») и копия, сейчас загруженная с сервера («их»).

Затем отсортируйте все записи во всех трех файлах и просмотрите их одну за другой:

  • если старый == мой, используйте их
  • иначе, если старый == их, используйте мой
  • иначе у вас будет конфликт; сделайте что-нибудь с этим (например, всегда используйте мой, он же «последний писатель побеждает»)

Обратите внимание, что «мой», «их» или «старый» может не существовать. Приведенные выше правила все еще применяются в этом случае; если вы выбрали результат «не существует», тогда вы захотите удалить запись в выходном файле.

Наконец, загрузите полученный файл обратно на сервер, чтобы он стал «их» базой данных для следующего парня. Затем скопируйте новый файл в свои локальные «старую» и «мою» базы данных.

(Есть более эффективные алгоритмы, чем приведенные выше ... но нет более простых :) А дисковое пространство в настоящее время довольно дешево, особенно если вы сжимаете файлы.)

person apenwarr    schedule 07.06.2010

Вы можете использовать другой метод синхронизации. С какими данными вы будете иметь дело?

Я добился больших успехов, используя облегченную заднюю часть с рельсами.

person jessecurry    schedule 02.06.2010
comment
Просто несколько простых объектов модели (в основном состоящих из NSStrings, NSArrays и т. Д.) - person indragie; 03.06.2010
comment
Если вас устраивают рельсы, посмотрите проект ObjectiveResource. - person Frank Schmitt; 03.06.2010
comment
Я сожалею, что у меня есть только один голос за комментарий Фрэнка Шмитта. - person corprew; 10.06.2010

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

person Alex Reynolds    schedule 02.06.2010
comment
Я рассматривал этот вариант, но как проще всего объединить изменения между двумя базами данных Core Data? - person indragie; 03.06.2010
comment
IPhone не поддерживает службы синхронизации, доступные для OS X (разработчик .apple.com / iphone / library / technotes / tn2009 /), поэтому вам нужно будет написать свои собственные процедуры. Изучите возможность добавления метки времени к записям и предоставления пользователю возможности определять политику того, как происходит синхронизация (например, последняя запись с меткой времени отправляется на все другие устройства). - person Alex Reynolds; 03.06.2010

Вероятно, вы захотите экспортировать данные в какой-либо формат, отличный от собственного формата sqlite. Если бы я разрабатывал что-то подобное, я бы предпочел формат JSON.

Я не смотрел на API Dropbox, но они поддерживают загрузку и скачивание различий в файлах, а не целиком, верно? В зависимости от того, как работает API, возможно, ваше приложение понимает их формат "diff" и работать с ним будет проще ...

person Mark Bessey    schedule 02.06.2010
comment
Преобразование данных в JSON не будет проблемой. У меня все еще есть проблема, как эффективно объединить изменения между двумя библиотеками. - person indragie; 03.06.2010
comment
К сожалению, синхронизация - это вообще сложная проблема. Если вы хотите синхронизировать в обоих направлениях, вам нужно будет вести какой-то счетчик модификаций для каждой записи и брать последнюю версию при слиянии. Настоящая проблема заключается в разумном разрешении конфликтов. - person Mark Bessey; 03.06.2010
comment
Это то, что я предполагал, мне нужно найти способ разрешать конфликты. Один конкретный сценарий, о котором я думаю, заключается в том, что если на устройстве A была запись, но затем она была удалена, а на устройстве B есть эта запись, но она не удалена, я бы не хотел, чтобы устройство A получало эту запись обратно при синхронизации ... это сложно - person indragie; 05.06.2010