Синхронизация iOS Core Data с удаленным сервером, который отправляет XML - PullRequest
2 голосов
/ 28 сентября 2010

Мое приложение анализирует XML с удаленного сервера и сохраняет объекты в Core Data (хранилище SQLite). Так что пользователь может просматривать материал в автономном режиме, читая из локального хранилища.

Пользователь может вносить изменения в объекты при просмотре в автономном режиме, который хранится локально в хранилище Core Data SQLite. Другой Пользователь вносит некоторые изменения в объект на Удаленном сервере, и он сохраняется там. Теперь, когда я обнаруживаю интернет-соединение, мое приложение должно синхронизировать локальное хранилище с удаленным сервером. Это означает, что удаленный сервер обновляется с изменениями, которые я внес в свои Базовые данные (хранилище SQLite), когда я был в автономном режиме, и в моем локальном хранилище - Базовые данные (хранилище SQLite) должны быть обновлены с учетом изменений, внесенных другим пользователем в удаленный сервер.

Например, есть форум, и он хранится в моем локальном хранилище, так что я могу читать и отвечать, когда я путешествую. Когда позже в интернете доступен. Мое приложение должно автоматически помещать все мои ответы, хранящиеся в основных данных, на удаленный сервер, а также переносить другие сообщения на удаленном сервере в мое локальное хранилище.

Удаленный сервер отправляет XML, который я анализирую и храню в Coredata. Моя проблема в том, как его синхронизировать? Как происходит двустороннее общение, когда происходят изменения? Как синхронизировать только те данные, которые изменились, а не ИМПОРТИРОВАТЬ всю удаленную серверную БД и наоборот?

Ответы [ 3 ]

2 голосов
/ 28 сентября 2010

Я знаю один из способов сделать это ..

  1. добавить еще одно поле в вашу локальную и серверную базу данных. т.е. временная метка.
  2. когда пользователь изменяет данные в локальной базе данных, изменяет метку времени на текущее время. сделать то же самое на сервере .. т.е. Когда кто-то редактирует данные на сервере, измените метку времени на текущее время.
  3. Когда пользователь подключается к Интернету ... проверьте локальную метку времени для метки времени сервера. Случай 1 Оба одинаковы - нечего делать case 2 local time> server time - используйте sql, чтобы получить все данные, имеющие метку времени больше, чем метка времени сервера ... и загрузить их на сервер ... case 3 local

Я не уверен, есть ли лучший способ ... но это, безусловно, работает ...

0 голосов
/ 23 ноября 2010

Сделки.Вы хотите следовать правилам ACID для транзакций.По сути, вы должны убедиться, что данные не обновлены, что вы не обновили локально, прежде чем изменять локальную запись для обновления.

Таким образом, самый простой способ - это получить пользователь с самого последнего обновления с сервера, а затемперезаписать это и убедиться, что с временными метками обновление не происходит во время этого процесса.Еще лучше, используйте блокировку с потоками, чтобы гарантировать, что больше ничего не произойдет.

Если вы используете транзакции Google или ACID, там будет много информации.Это большая область в средах RDBMS, где многие пользователи могут повредить данные, и между записями и обновлениями должны сохраняться блокировки.

0 голосов
/ 28 сентября 2010

Одним из решений может быть

  • iphone синхронизирует изменения с сервером
  • сервер объединяет новые и старые вещи
  • iphone получает новые изменения (изобъединить) с сервера

Итак, пусть сервер будет главным, который должен знать, как объединять данные, а клиенты должны загружать данные только постепенно после некоторых изменений.

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