Синхронизация локального файла sqlite с iCloud

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

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

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

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

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

Метод 1:

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

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

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

Метод 2:

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

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

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

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

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

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

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

18
задан JDR 15 November 2011 в 23:57
поделиться