Ho lo stesso problema con un progetto su cui sto lavorando, la soluzione nel mio caso era quella di creare un campo nullo extra nelle tabelle locali chiamate remote_id. Quando sincronizzi i record dal database locale a quello remoto se remote_id è nullo, significa che questa riga non è mai stata sincronizzata e deve restituire un ID univoco che corrisponde all'id della riga remota.
Local Table Remote Table
_id (used locally)
remote_id ------------- id
name ------------- name
Nell'applicazione client collego le tabelle tramite il campo _id, in remoto utilizzo il campo id remoto per recuperare dati, fare join, ecc.
esempio locale:
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
esempio da remoto:
Remote Client Table Remote ClientType Table Remote ClientType
id -------------------- client_id
client_type_id -------------- id
name name name
Questo scenario, e senza alcuna logica nel codice, causerebbe errori di integrità dei dati, poiché la tabella client_type potrebbe non corrispondere all'ID reale nelle tabelle locali o remote, quindi ogni volta che viene generato un remote_id, restituisce un segnale a l'applicazione client che chiede di aggiornare il campo _id locale, attiva un trigger precedentemente creato in sqlite aggiornando le tabelle interessate.
link
1- remote_id è generato nel server
2- restituisce un segnale al client
3- client aggiorna il suo campo _id e attiva un trigger che aggiorna le tabelle locali che uniscono _id
locale
Naturalmente utilizzo anche un campo last_updated per aiutare le sincronizzazioni ed evitare sincronizzazioni duplicate.