Там, где я работаю, мы разработали «автономную» версию нашего основного (веб) приложения, чтобы пользователи могли работать на своих ноутбуках в местах, где у них нет доступа к Интернету (я не уверен, сколько из них Места на самом деле существуют в наши дни, но мне сказали, что они есть;)). Когда пользователь возвращается на основной сайт, ему необходимо синхронизировать введенные данные в автономном режиме с нашим основным приложением.
Итак, чтобы ответить на ваши вопросы:
- Какие самые последние данные? Как я хочу это представить?
У нас есть столбец LAST_UPDATED_DATE в каждой таблице. Сервер отслеживает, когда происходят синхронизации, поэтому, когда автономное приложение запрашивает синхронизацию, сервер говорит: «Эй, дай мне только данные, измененные с этой даты».
- Что мне делать в случае конфликта? Слияние? Должен ли я спросить и спросить
пользователю что делать?
В нашем случае автономное приложение может обновлять только относительно небольшое подмножество всех данных. Поскольку каждая запись синхронизируется, мы проверяем, является ли это одним из этих случаев, и если это так, то мы сравниваем LAST_UPDATED_DATE для записи как онлайн, так и офлайн. Если даты разные, мы также проверяем значения (потому что это не конфликт, если они оба обновлены до одного и того же значения). Если есть конфликт, мы записываем разницу, устанавливаем флаг, чтобы сказать, что есть хотя бы один конфликт, и продолжаем проверять остальные детали. После завершения процесса, если установлен флаг isConflict, пользователь может перейти на специальную страницу, где отображаются различия и решить, какие данные являются «правильной» версией. Затем эта версия сохраняется на хосте, а флаг isConflict сбрасывается.
- Что мне делать, если я не хочу вступать в противоречие
состояние
- Как возобновить текущую синхронизацию, которая была прервана?
Ну, во-первых, мы стараемся не входить в противоречивое состояние. Если по какой-либо причине синхронизация прерывается, тогда last_synchronisation_date не обновляется, и поэтому при следующем запуске синхронизации она начнется с той же даты, что и дата начала предыдущей (прерванной) синхронизации.
- Как мне обращаться с хранилищем данных (например, база данных MySQL в веб-сервисе, Core
Данные на айфон; и как мне
объединить / синхронизировать данные без большого количества
клей код)?
Мы используем стандартные базы данных как для приложений, так и для объектов Java между ними. Объекты сериализуются в XML (и распаковываются для ускорения передачи) для фактического процесса синхронизации, а затем распаковываются / десериализуются на каждом конце.
- Как мне обрабатывать правки пользователя, которые происходят во время синхронизации
(который работает в фоновом режиме, поэтому
Пользовательский интерфейс не заблокирован)?
Эти правки будут иметь место после даты начала синхронизации, и поэтому не будут приниматься с другой стороны до следующей синхронизации.
- Как и в каком направлении я распространяю изменения (например, пользователь создает
запись «Foo» на его компьютере и
не синхронизируется; тогда он на ходу и
создает другую запись «Foo»; какие
происходит, когда он пытается синхронизировать оба
устройства)? Будет ли у пользователя два «Foo»
записи с разными уникальными идентификаторами?
Будет ли у пользователя только одна запись, но
какой?
Вам решать, как вы хотите обрабатывать этот конкретный Foo ... т.е. в зависимости от того, что является первичным ключом Foo, и как вы определяете, является ли один Foo тем же, что и другой.
- Как мне обрабатывать синхронизацию, когда у меня есть иерархические данные? Низходящий?
Вверх дном? Я лечу каждую запись
атомно или я только смотрю на
supernode
The SynisДействие является атомарным, поэтому, если одна запись заканчивается неудачей, весь процесс помечается как незавершенный, аналогично транзакции фиксации Subversion.
- Насколько велик компромисс между упрощением вещей и инвестированием
слишком много времени на реализацию?
Я не совсем уверен, что вы имеете в виду, но я бы сказал, что все зависит от вашей ситуации и типа / количества данных, которые вы хотите синхронизировать. На разработку и реализацию процесса может уйти много времени, но это возможно.
Надеюсь, это поможет вам или, по крайней мере, даст вам несколько идей! :)