Tengo el mismo problema con un proyecto en el que estoy trabajando, la solución en mi caso fue crear un campo anulable adicional en las tablas locales llamadas remote_id. Al sincronizar registros de la base de datos local a la remota si remote_id es nulo, significa que esta fila nunca se ha sincronizado y necesita devolver una identificación única que coincida con la identificación de la fila remota.
Local Table Remote Table
_id (used locally)
remote_id ------------- id
name ------------- name
En la aplicación cliente, enlazo tablas por el campo _id, de forma remota uso el campo de identificación remota para obtener datos, hacer uniones, etc.
ejemplo localmente:
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
ejemplo de forma remota:
Remote Client Table Remote ClientType Table Remote ClientType
id -------------------- client_id
client_type_id -------------- id
name name name
Este escenario, y sin ninguna lógica en el código, causaría fallas en la integridad de los datos, ya que la tabla client_type puede no coincidir con la identificación real en las tablas locales o remotas, por lo tanto, cada vez que se genera un id_remoto, devuelve una señal a la aplicación cliente. pidiendo actualizar el campo local _id, esto dispara un disparador creado previamente en sqlite que actualiza las tablas afectadas.
http://www.sqlite.org/lang_createtrigger.html
1- remote_id se genera en el servidor
2- devuelve una señal al cliente
3- el cliente actualiza su campo _id y dispara un disparador que actualiza las tablas locales que se unen al _id local
Por supuesto, también uso un campo last_updated para ayudar a las sincronizaciones y evitar sincronizaciones duplicadas.