У мене те саме питання з проектом, над яким я працюю, у моєму випадку рішенням було створити додаткове нульове поле в локальних таблицях з назвою remote_id. Якщо синхронізувати записи з локальної у віддалену базу даних, якщо remote_id недійсний, це означає, що ця рядок ніколи не була синхронізована і їй потрібно повернути унікальний ідентифікатор, що відповідає віддаленому ідентифікатору рядка.
Local Table Remote Table
_id (used locally)
remote_id ------------- id
name ------------- name
У клієнтській програмі я посилаю таблиці таблиць у полі _id, віддалено використовую поле віддаленого ідентифікатора для отримання даних, приєднання до ін.
Приклад локально:
Local Client Table Local ClientType Table Local ClientType
_id
remote_id
_id -------------------- client_id
remote_id client_type_id -------------- _id
remote_id
name name name
Приклад віддалено:
Remote Client Table Remote ClientType Table Remote ClientType
id -------------------- client_id
client_type_id -------------- id
name name name
Цей сценарій і без будь-якої логіки в коді може спричинити збої цілісності даних, оскільки таблиця_типу client_type може не відповідати дійсному ідентифікатору ні в локальній, ні в віддаленій таблиці, для цього кожен раз, коли генерується віддалений_id, він повертає сигнал клієнтській програмі з проханням оновити локальне поле _id, це запускає створений раніше тригер у sqlite, оновлюючи постраждалі таблиці.
http://www.sqlite.org/lang_createtrigger.html
1- remote_id генерується на сервері
2- повертає сигнал клієнту
3- клієнт оновлює своє поле _id та запускає тригер, який оновлює локальні таблиці, що приєднуються до локальних _id
Звичайно, я також використовую поле last_update, щоб допомогти синхронізації та уникнути дублювання синхронізацій.