The build-in way to sync items is via function called SyncFolderItems. Basically to Exchange everything, including contacts is a folder, so you’ll just pass CONTACTS as DistinguishedFolderId in your sync request.
The sync works by downloading all the items for given account in batches of max 512 elements and after each batch it gives you SyncState as a reference point for Exchange to know where you left off. So it gives you ability to do incremental sync.
Now, that’s one way of course, meaning Exchange -> Your DB. The other way it around you should preform atomic updates/request – the moment you change/add/delete item form your db you should issue adequate request to Exchange server to keep data in sync, else it’ll be overwritten on your next SyncFolderItems.