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