Я храню некоторые данные в своем приложении iOS непосредственно в локальном файле .sqlite. Я решил сделать это вместо CoreData, потому что данные должны быть совместимы с платформами, отличными от Apple.
Теперь я пытаюсь найти лучший способ синхронизировать этот файл через iCloud. Я знаю, что вы не можете синхронизировать его напрямую по многим причинам. Я знаю, что CoreData может синхронизировать свои БД, но даже игнорирование того, что использование CD по существу блокирует этот файл на платформах Apple (я думаю, что я только немного посмотрел на CD), мне нужна синхронизация iCloud этого файла для работы ВСЕ поддерживаемые iCloud платформы, которые должны включать Windows. Я должен предположить, что не будет никакой совместимости для файлов CoreData в Windows API. Планирование наилучшего способа выполнить это было бы намного проще, если бы Apple сообщила нам больше, чем "Будет ли Windows API [в конце концов?]"
Кроме того, в конечном итоге мне понадобится реализовать хотя бы еще одну службу синхронизации для поддержки платформ, которые iCloud не делает. Было бы полезно, хотя это и не требуется, если метод, который я использую для iCloud, может быть в основном повторно использован для будущих сервисов.
По этим причинам я не думаю, что CoreData поможет мне в этом. Правильно ли я это считаю?
Двигаясь оттуда, мне нужно разработать алгоритм для этого или найти существующее или существующее стороннее решение. Я еще ничего не споткнулся. Тем не менее, я рассматривал несколько возможных методов, которые я мог бы реализовать:
Способ 1:
Сделайте что-то похожее на то, как CoreData синхронизирует sqlite DB: отправьте "журналы транзакций" в iCloud и создайте каждый локальный файл sqlite.
Я думаю, что каждое устройство отправит текстовый файл с уникальным именем, в котором перечислены все команды sql, которые это устройство выполнило, с отметками времени. Устройство будет хранить, как далеко в каждом списке команд, которые он выполнил, и продолжать с этой точки каждый раз, когда файл обновляется. Если он сразу получает обновления для нескольких файлов журнала, он будет выполнять каждую команду в порядке отметки времени.
Вещи могут получить "интересную" эффективность после того, как эти файлы станут большими, но это похоже на разрешимую проблему.
Способ 2:
Периодически синхронизировать копию рабочей базы данных с iCloud. В каждой записи укажите временную метку изменения. Когда обновленная копия БД проступает, запрашивать все записи с новыми временными метками, чем некоторые отсчета времени и обновлять записи в локальной БД с новыми данными.
Я вижу много потенциальных проблем с этим методом:
-Принять что-то еще, чтобы распознать удаление записи.
-Данный файл БД может вызвать конфликты. Возможно, им удастся справиться с ними, обработав каждую версию конфликта в порядке отметки времени.
-Определение даты для проверки каждого обновления может быть сложным, так как зависит от того, из какого устройства происходит обновление.
Существует много потенциальных проблем с методом 2, но метод 1 кажется мне полезным...
Есть ли у кого-нибудь какие-либо предложения относительно того, что может быть лучшим способом? Любые лучшие идеи, чем мой "Метод 1" (или причины, почему это не сработало)?