Ответ 1
Как вы описываете проблему управления версиями, например, этот вопрос. Выбор за вами - как решить. Вот несколько примеров других продуктов с этой проблемой:
- Документы Google: A делает редактирование в автономном режиме, B делает редактирование онлайн, A выйдет в сети, Sync, Google Docs объединяет изменения A и B.
- Примечания к Apple: такие же, как Документы Google
- Git/Subversion: выдайте ошибку, попросите пользователя разрешить конфликты.
- Wunderlist: последнее изменение перезаписывает предыдущие
Для вашего случая это простейшее решение - использовать подход Wunderlist, но, похоже, это может вызвать проблему юзабилити. Что ожидают ваши пользователи?
Отвечая на ваши вопросы напрямую:
- Выполнение пользовательской синхронизации необходимо, если вы не хотите перезаписывать.
- Это решение для удобства использования, чего ожидает пользователь?
- Правда, ревизии являются числовыми (например, r1, r2). Чтобы получить соглашение с сервером, измените возвращаемое значение последнего запроса синхронизации. Вы можете вернуть всю модель клиенту каждый раз (или всего 200 OK, если произошла обычная синхронизация). Если модель возвращается клиенту, обновите клиент последней моделью.
В любом случае сервер всегда должен быть источником правды. Этот пост содержит некоторые полезные рекомендации по ссылочной целостности серверов и мобильных устройств:
Для отслеживания вставок вам нужна созданная временная метка... Чтобы отслеживать обновления, вам нужно отслеживать временную метку LastUpdate в ваших строках... Для отслеживания удалений вам нужна таблица надгробных камней.
Обратите внимание, что когда вы выполняете синхронизацию, вам нужно проверить смещение по времени между сервером и мобильным устройством, и вам нужно иметь метод разрешения конфликтов. Вставки не имеют большого значения (они не должны конфликтовать), но обновления могут конфликтовать, и удаление может конфликтовать с обновлением.