I managed to solve this myself.
The rhom stuff and the updates were all working correctly. However I was inadvertanly syncing more than expected with my device, so I had multiple stops with the same display index in the stops model, some of which were not being displayed.
The code was simply updating the first stop it found with the matching display index. Sometimes that was the stop being displayed, other times it was a completely separate stop.
Once I realised this I could add an extra clause to my query to ensure the right stop was selected, and also filter the data being sent to my device a little more effectively.