Ho lo stesso problema con un progetto a cui sto lavorando, la soluzione nel mio caso era quella di creare un campo nulla annullabile nelle tabelle locali chiamato remote_id. Quando si sincronizzano i record dal database locale al database remoto se remote_id è null, significa che questa riga non è mai stata sincronizzata e deve restituire un ID univoco corrispondente 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, eseguire join, ecc.
esempio a livello 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 alcun logico nel codice, causerebbe errori di integrità dei dati, poiché la tabella client_type potrebbe non corrispondere all'id reale né nelle tabelle locali o remote, pertanto ogni volta che viene generato un remote_id, restituisce un segnale all'applicazione client chiedendo di aggiornare il campo _id locale, viene attivato un trigger precedentemente creato in sqlite che aggiorna le tabelle interessate.
http://www.sqlite.org/lang_createtrigger.html
1- remote_id viene 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 si uniscono a _id locale
Ovviamente utilizzo anche un campo last_updated per aiutare le sincronizzazioni ed evitare sincronizzazioni duplicate.