У меня та же проблема с проектом, над которым я работаю, в моем случае я решил создать дополнительное пустое поле в локальных таблицах с именем 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 может не совпадать с реальным идентификатором в локальной или удаленной таблицах, поэтому всякий раз, когда генерируется remote_id, он возвращает сигнал клиентскому приложению при запросе обновления локального поля _id запускается ранее созданный триггер в sqlite, обновляющий затронутые таблицы.
http://www.sqlite.org/lang_createtrigger.html
1- remote_id генерируется на сервере
2- возвращает сигнал клиенту
3 - клиент обновляет свое поле _id и запускает триггер, который обновляет локальные таблицы, которые присоединяются к локальному _id
Конечно, я использую также поле last_updated, чтобы помочь синхронизации и избежать дублирования синхронизаций.