2009-08-12 2 views
4

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

Вот пример схемы:

index_id (автоинкремент) | название | количество | user_id | создано (DateTime)

Similar thread

ответ

2

Это проблема, потому что вы должны иметь дело с определенными ситуациями, как. A = Сервер, B = iPhone

A - Adds new entry 
B - Adss new entry 
A - Get B's entry 
B - Get A's entry 
A - Update entry 
B - Delete A's entry 

(Какой из них вы используете, вы синхронизироваться изменения к В, что А сделал или вы удалить элемент на В, что А сделал?)

Синхронизирующая часть может быть простым запросом HTTP push/pull style, это логистика того, как правильно держать их в синхронизации, что вызывает проблемы.

Для ознакомления с: Как раз проверить iPhone на странице сервера (update.php) для любых изменений вместе с изменениями. Обновите сервер с изменениями, отправленными iPhone, и обновите iPhone с любыми изменениями, которые отправляют запросы (используя JSON или XML).

+0

Я согласен с вашим подходом - как вы отслеживаете эти изменения? Если обе базы данных имеют автоинкрементные идентификаторы, как вы сравниваете эти два? Теоретически единственной уникальной частью строки является index_id (созданный, вероятно, уникален на практике), но у вас могут быть две записи: одна на телефоне и одна на сервере с одинаковым названием/количеством/user_id. Как вы узнаете, что синхронизировать и что оставить в покое? – thekevinscott

0

Почему у вас нет вашего веб-приложения для безопасного и аутентифицированного веб-сервиса для ваших iPhone-клиентов?

Например, iPhones свяжутся с этой службой (используя JSON, XML, SOAP, что угодно), и вам нужно иметь только одну базу данных ONE.

+0

Это определенно возможность, но я бы хотел предоставить офлайн-доступ (под землей) для iPhone-приложения, таким образом, синхронизацию. – thekevinscott

5

Хорошо, у меня было два последующих идеи о том, как подойти к этому, подумал, что будет лучше в качестве ответа, чем на редактирование:

1) У вас есть две базы данных, один для телефона и один для веб-приложения. Схема будет выглядеть следующим образом:

index_id | title | amount | user_id | created | environment | foreign_id 

Так скажем, у меня есть запись на мобильном устройстве: 1, «Название», 2.00,1, NOW() и запись на моем веб-приложение, 1» Что-то ', 5.00,1, СЕЙЧАС(). Чтобы избежать этих двух противоречащих друг другу вопросов, веб-приложение добавит строку, в которой будут указаны слова 2, 'Title', 2.00,1, NOW(), 'mobile', 1.

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

2) Что делать, если вы назначили БД (например, веб-приложение) в качестве ведущего устройства и устройства в качестве подчиненного устройства, так что у вас была одна таблица в веб-приложении и две таблицы на устройстве. Для устройства у вас будет одна «очередь очередей», которая при подключении к сети будет обновлять базу данных живых веб-приложений (в то же время освобождая себя), а затем база данных WEB APP будет синхронизироваться, в одну сторону, обратно вторая главная таблица устройства.

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

+0

Это похоже на один из (очень редких) экземпляров, где полезны GUID для ПК. – jcollum

+0

Я думаю, 2) на самом деле единственный способ пойти. Вам нужно, чтобы одна из ваших баз данных была «всегда правильной», а другая - «вероятно, правильной». Телефон «вероятно, прав» и разговаривает с мастером db, чтобы узнать, правильно ли это. Если он не подключен, он сохраняет свои изменения локально и отмечает их как NeedsUpload. SQLite на обоих вариантах. SQLite подходит для любого сайта, который получает менее 100 тыс. Хитов в день. Я бы начал там, перейдем к mysql позже. – jcollum

+0

@jcollum, ваши аббревиатуры пролетают над моей головой. Можете ли вы уточнить/предоставить некоторые ссылки? Есть ли более элегантный способ реализовать решение 2, помимо наличия двух отдельных таблиц? Или это самое чистое решение? – thekevinscott

2

Просто скопируйте схему в обоих местах и ​​отметьте временную метку в каждой строке на каждом столе. Затем попросите клиента выслать свою новую временную метку и вернуть серверу строки, более новые, чем он.

Самый простой способ ...

+1

owkay, а как насчет удалений? –

+0

В этом методе вы сохранили бы строку навсегда и отметили бы delete как «invalid», чтобы она продолжала синхронизацию. Если вы часто обновляете данные, вы можете пострадать от раздувания, или вам, возможно, придется очищать записи старше определенного периода времени. –

Смежные вопросы