Это не совсем полный ответ, но, по крайней мере, может дать вам некоторые идеи ...
Вопрос, который вы задаете (и проблема, которую вы пытаетесь решить) не относится к Google Gears и будет действовать для других решений, таких как HTML 5 или системы на основе или Flash / Air.
Эта тема была представлена во время последнего ZendCon несколько месяцев назад. Слайды доступны на слайд-шоу: Планирование синхронизации с локальными базами данных браузера
Просматривая эти слайды, вы увидите заметки о нескольких возможностях, которые могут прийти в голову (некоторые из них действительно пришли вам в голову, или в других ответах) :
- Использование GUID
- Композитные ключи
- Пул первичных ключей (т.е. зарезервировать диапазон ключей заранее)
Конечно, для каждого из них есть свои преимущества ... и недостатки - я не буду их копировать-вставлять: взгляните на слайды; -)
Теперь, в вашей ситуации, какое решение будет лучшим? Трудно сказать, на самом деле - и чем раньше вы подумаете о синхронизации, тем лучше / проще это будет, вероятно: добавление материала в приложение будет намного проще, когда это приложение еще находится на стадии разработки ^^
Во-первых, было бы интересно определить:
- Ваше приложение обычно подключено, и отключение происходит редко
- Или если ваше приложение обычно отключено и подключается только время от времени.
Тогда, что вы собираетесь синхронизировать?
- Данные?
- Like " Это список всех команд, выполненных этим пользователем "
- С этими данными, реплицированными на каждое отключенное устройство, разумеется - что каждый может его изменить
- В этом случае, если один пользователь удаляет строку, а другой добавляет строку, как узнать, какой из них имеет данные " true "?
- Или действия над этими данными?
- Как " Я добавляю запись в список команд, сделанных этим пользователем "
- В этом случае, если один пользователь удаляет строку, а другой добавляет строку, синхронизировать легко, так как вам просто нужно синхронизировать эти два действия с вашей центральной БД
- Но это не совсем легко реализовать, особенно для большого приложения / системы: каждый раз, когда совершается какое-либо действие, вы должны что-то регистрировать!
Существует также особая проблема, о которой мы обычно не думаем - пока это не произойдет: особенно если ваш процесс синхронизации может занять некоторое время (если у вас много данных, если вы не часто синхронизируете,. ..) , что если синхронизация остановится, когда она еще не закончена?
Например, что если:
- Пользователь в поезде имеет доступ к сети с некоторой картой 3G
- Синхронизация начинается
- есть туннель - и соединение потеряно.
Наличие полусинхронизированных данных может быть не очень хорошим в большинстве ситуаций ...
Итак, вам нужно найти решение и этой проблемы: в большинстве случаев синхронизация должна быть атомарной!