Mam ten sam problem z projektem, nad którym pracuję, rozwiązaniem w moim przypadku było utworzenie dodatkowego pola zerowego w lokalnych tabelach o nazwie remote_id. Podczas synchronizacji rekordów z lokalnej do zdalnej bazy danych, jeśli identyfikator_zdalny ma wartość NULL, oznacza to, że ten wiersz nigdy nie został zsynchronizowany i musi zwrócić unikalny identyfikator pasujący do identyfikatora zdalnego wiersza.
Local Table Remote Table
_id (used locally)
remote_id ------------- id
name ------------- name
W aplikacji klienckiej łączę tabele według pola _id, zdalnie używam zdalnego pola id do pobierania danych, wykonywania połączeń itp.
przykład lokalnie:
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
przykład zdalnie:
Remote Client Table Remote ClientType Table Remote ClientType
id -------------------- client_id
client_type_id -------------- id
name name name
Ten scenariusz i brak logiki w kodzie spowodowałby błędy integralności danych, ponieważ tabela typu klient może nie pasować do rzeczywistego identyfikatora w tabelach lokalnych lub zdalnych, dlatego za każdym razem, gdy identyfikator zdalny jest generowany, zwraca sygnał do aplikacji klienckiej z prośbą o aktualizację lokalnego pola _id, to uruchamia wcześniej utworzony wyzwalacz w sqlite aktualizujący dotknięte tabele.
http://www.sqlite.org/lang_createtrigger.html
1- zdalny_id jest generowany na serwerze
2- zwraca sygnał do klienta
3- klient aktualizuje swoje pole _id i uruchamia wyzwalacz, który aktualizuje lokalne tabele, które dołączają do lokalnego _id
Oczywiście używam również pola last_updated, aby ułatwić synchronizację i uniknąć powielonych synchronizacji.