Я храню некоторые данные в своем приложении 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" (или причины, по которым он не работает)?