У меня та же проблема с проектом, над которым я работаю, в моем случае решением было создать дополнительное пустое поле в локальных таблицах с именем 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, чтобы помочь синхронизации и избежать дублирования синхронизации.