Синхронизация локального файла sqlite в iCloud - PullRequest
18 голосов
/ 16 ноября 2011

Я храню некоторые данные в своем приложении для iOS непосредственно в локальном файле .sqlite. Я решил сделать это вместо CoreData, потому что данные должны быть совместимы с платформами не-Apple.

Теперь я пытаюсь найти лучший способ синхронизации этого файла через iCloud. Я знаю, что вы не можете синхронизировать его напрямую по многим причинам. Я знаю, что CoreData может синхронизировать свои базы данных, но даже если игнорировать тот факт, что использование CD по существу блокирует этот файл на платформах Apple (я думаю? Я только немного изучил компакт-диск), мне нужна синхронизация iCloud этого файла для работы через ВСЕ поддерживаемые платформы iCloud - которые должны включать Windows. Я должен предположить, что не будет никакой совместимости для файлов CoreData в Windows API. Планировать лучший способ достижения этой цели было бы намного проще, если бы Apple сказала нам больше, чем «Будет Windows API [в конце концов?]»

Кроме того, мне в конечном итоге потребуется реализовать как минимум еще один сервис синхронизации для поддержки платформ, которые не поддерживает iCloud. Было бы полезно, хотя и не обязательно, использовать метод, который я использую для iCloud, в основном для будущих сервисов.

По этим причинам я не думаю, что CoreData может помочь мне в этом. Правильно ли я думаю об этом?

Двигаясь дальше, мне нужно разработать алгоритм для этого или найти существующее или существующее стороннее решение. Я еще ни разу не наткнулся. Тем не менее, я обдумывал пару возможных методов, которые я мог бы реализовать:

Метод 1:

Сделайте что-то похожее на то, как CoreData синхронизирует базы данных sqlite: вместо этого отправьте «журналы транзакций» в iCloud и создайте из них каждый локальный файл sqlite.

Я думаю, что каждое устройство будет отправлять текстовый файл с уникальным именем, в котором перечислены все команды sql, которые это устройство выполняло, с отметками времени. Устройство будет хранить информацию о том, как далеко в каждом списке выполненных им команд, и продолжать с этого момента каждый раз, когда файл обновляется. Если бы он получал обновления сразу для нескольких файлов журнала, он выполнял бы каждую команду в порядке отметки времени.

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

Метод 2:

Периодически синхронизируйте копию рабочей базы данных в iCloud. Имейте поле модификации времени в каждой записи. Когда поступит обновленная копия БД, запросите все записи с более новыми временными метками, чем некоторое эталонное время, и обновите запись в локальной БД на основе новых данных.

Я вижу много потенциальных проблем с этим методом:

- Нужно реализовать что-то еще, чтобы распознать удаление записи.

-БД файл может получить конфликты. Возможно, с ними можно справиться, обрабатывая каждую версию конфликта в порядке отметки времени.

- Определить дату проверки каждого обновления может быть непросто, так как это зависит от того, с какого устройства поступает обновление.

Существует много потенциальных проблем с методом 2, но метод 1 кажется выполнимым для меня ...

Есть ли у кого-нибудь какие-либо предложения относительно того, что может быть лучшим вариантом действий? Есть идеи получше, чем мой «Метод 1» (или причины, по которым он не работает)?

Ответы [ 3 ]

3 голосов
/ 29 ноября 2011

Попробуйте эти два решения от Рэй Вендерлих:

Экспорт / Импорт данных по почте: http://www.raywenderlich.com/1980/how-to-import-and-export-app-data-via-email-in-your-ios-app

Обмен файлами с iTunes: http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app

Я нашел это довольно сложным, но мне очень помогло.

1 голос
/ 16 февраля 2012

Как метод 1, так и метод 2 кажутся выполнимыми. Возможно, на самом деле их комбинация - использовать iCloud для отправки отдельного файла базы данных, который представляет собой подмножество данных, то есть просто измененные элементы. Или, может быть, другой формат файла вместо sqlite db - XML ​​/ JSON / CSV и т. Д.

Другой альтернативой является сделать это вне iCloud - то есть простой пользовательский веб-сервис для синхронизации. Таким образом, каждое изменение отправляется на центральный сервер через JSON / XML по HTTP, а затем другие устройства извлекают из него обновления.

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

0 голосов
/ 16 ноября 2012

Я рассмотрел возможность передачи файла базы данных через iCloud, но думаю, что у меня возникнут классические проблемы с синхронизацией - медленный запуск для пользователя - и поврежденные базы данных, если приложение будет запущено на нескольких устройствах одновременно.(например, iPad / iPhone).

Оооочень.Мне пришлось использовать метод журналов транзакций.Это действительно сложно реализовать, но когда-то на месте, кажется, все в порядке.

Я использую образец Apple SharedCoreData в качестве основы для этой работы.Для этой ссылки требуется учетная запись разработчика Apple.

Я нашел гораздо лучшее решение из Тим Роудли , однако это работает только для IOS, и мне нужны и IOS, и MacOS.

rant> Разработка iCloud действительно должнастановиться проще и стабильнее!/ Декламация

...