Подтвердить что ты не робот

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

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

4b9b3361

Ответ 2

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

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

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

Ответ 3

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

Тааак. Мне пришлось использовать метод транзакций. Это действительно сложно реализовать, но один раз на месте, кажется, хорошо.

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

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

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