Процедура синхронизации основных данных с веб-сервисом - PullRequest
1 голос
/ 03 октября 2011

Я занимаюсь разработкой приложения, которое необходимо синхронизировать с удаленной базой данных. База данных подключена к веб-приложению, которое позволяет пользователю изменять некоторые записи на веб-странице. (Добавлять / удалять / изменять) Пользователь также может изменять те же записи в мобильном приложении. Таким образом, каждая сторона (сервер-клиент) должна хранить те же самые последние записи, когда пользователь нажимает кнопку синхронизации в мобильном приложении. Связь между сервером и клиентом обеспечивается веб-серверами (SOAP), и я не могу изменить его из-за строгих требований. (я знаю, что это худший способ, который можно использовать). И еще одно требование - клиенты не могут удалять записи сервера.

Я уже знаком с коммуникационным веб-сервисом (NSURLConnection), получением данных (NSData) и их разбором. Но я не мог понять, какой должна быть процедура синхронизации. Я уже прочитал этот ответ, который о том, как я могу изменить стороны сервера и клиента с некоторыми дополнительными атрибутами ( last_updated_date и is_sync )


Тогда я мог бы решить, как решить эту проблему:

В качестве первого шага клиент продолжает пытаться изменить записи сервера, отправляя несинхронизированные записи. Новые записи напрямую добавляются в БД, но измененные записи следует сравнивать в зависимости от last_updated_date . В конце этого шага сервер имеет последние данные .

Но проблема в том, как можно изменить записи в мобильном приложении. Я подумала это двояко:

  1. - самый глупый способ создания нового MOC, загрузки всех записей в него и замены на существующий.

  2. - это получение всех измененных записей, которые не находятся на стороне клиента, импортирование их в новый MOC и объединение этих двух. Но в этот момент у меня есть некоторые проблемы, такие как

    Может быть два элемента, которые реплицируются (старая версия - обновленная версия)

    Удаленные элементы все еще могут находиться в основных МОС.

    Мне нужно связать несколько связей между MOC. (новая запись может иметь более 4 связей со старыми записями)

Так что, я думаю, вы, ребята, можете помочь мне найти другие идеи, которые являются лучшими ??

1 Ответ

1 голос
/ 03 октября 2011

Синхронизация данных - нетривиальная задача.

Существует несколько уровней синхронизации. Исходя из вашего вопроса, я думаю, вам просто нужно отправить изменения обратно на сервер. В этом случае я бы предложил поймать его во время -save: из NSManagedObjectContext. Непосредственно перед -save: вы можете запросить NSManagedObjectContext и спросить его, какие объекты были созданы, обновлены и удалены. Оттуда вы можете создать запрос для отправки обратно на ваш веб-сервис.

Однако работать со слияниями гораздо сложнее, и я предлагаю вам разобраться с ними на сервере.

Что касается вопроса о ваших отношениях; Я предлагаю вам открыть второй вопрос, чтобы не было путаницы.

Обновление

Как только сервер завершил слияние, он передает новую «правду» клиенту. Клиент должен взять эти обновленные записи и объединить их в свои собственные изменения. Это слияние довольно просто:

  1. Поиск существующей записи с использованием уникального идентификатора.
  2. Если запись существует, обновите ее.
  3. Если запись не существует, создайте ее.

Игнорирование производительности на данный момент, это довольно просто:

  1. Настройка цикла для поступления новых данных.
  2. Установите NSPredicate для идентификации записи, которая будет обновлена ​​/ создана.
  3. Запустите ваш запрос на выборку.
  4. Если запись существует, обновите ее.
  5. Если это не так, создайте его.

Как только вы начнете работать с полным циклом, вы можете начать смотреть на производительность и т. Д. Шаг первый - заставить его работать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...