Каковы основные проблемы создания приложения для iPhone, которое синхронизирует данные с сервером через веб-API?
Я хочу создать приложение, которое использует данные с сервера, и оно должно синхронизировать данные в приложении с данными, введенными другими клиентскими приложениями. Итак, есть несколько вопросов:
- Как эффективно разработать схему базы данных? Должен ли он реплицировать ту же схему базы данных на сервере или добавить еще несколько полей и объектов?
- Каковы стратегии синхронизации данных при каждом запуске приложения или во время неактивного состояния приложения, или что-то еще...
- Как обрабатывать конфликт данных, введенных пользователем в приложение, и данных, введенных другим клиентским приложением.
Любой ответ приветствуется.
1 ответ
Ну, вы определили основные проблемы в вашем первоначальном вопросе. Реальный ответ заключается в том, что это не имеет ничего общего с iPhone - репликация базы данных просто очень сложно.
Вот несколько практических правил, которые я могу предложить:
Односторонняя репликация данных в миллион раз проще, чем двусторонняя, если вам это сойдет с рук.
Репликация всегда проще, если схема базыданных идентична на клиенте и на сервере.
Чтобы выполнить двустороннюю репликацию, необходимо либо сохранитьвременные метки для каждой строки на каждом конце, либо сохранить полное содержимое одного конца на другом конце. (т. е. сервер должен знать самый последний статус клиента, или клиент должен знать самый последний статус сервера).
чтобы разрешить добавление строк от отключенных клиентов, вам нужноидентифицировать ваши строки, используя GUID(или хэш, например, SHA-1), а не поле автоинкремента. Можно добавить новые строки, добавленные клиентом, как "без идентификатора", пока вы не синхронизируете их с сервером, но в этом и заключается безумие.
На самом деле нет хорошего способа разрешения конфликтов. Несовершенные параметры включают в себя последние выигрыши автора (последний, кто синхронизирует измененную запись, получает вставленную копию записи), трехстороннее объединение (когда кто-то отправляет измененную запись, проверяет, какие столбцы были изменены, и изменяет только те, столбцы, таким образом, не перезаписывая какие-либо изменения в других столбцах), разделение на две записи (если два человека вносят изменения в одну и ту же запись, просто сделайте две записи и предположите, что кто-то исправит это в конечном итоге), и "попросите пользователя" (который технически наиболее эффективен, но требует много работы с пользовательским интерфейсом, и пользователи редко понимают, что такое конфликт).