Если Вы хотя бы раз кэшировали в iOS Core Data данные, полученные от некоторого удаленного сервиса,
то обратили внимание, что у объектов нет первичных ключей.
Поэтому, если попытаться сохранить существующий объект, то появится дубликат.
Итак, что же с этим делать?

Решение

Перед сохранением объекта можно делать запрос к Core Data о существовании объекта с таким же идентификатором.
Но тогда получится, что к SQLite будут идти запросы в цикле для каждого объекта, который мы хотим сохранить.
Лучший подход – разом получить все существующие объекты, сохранить их ключи в массив и потом, перед сохранением нового объекта, проверять нет ли такого идентификатора в массиве.

Код

NSMutableArray* existingIds = [[NSMutableArray alloc] init];
//Получаем все идентификаторы(NSFetchRequest)...
if(![existingIds containsObject:new_id]){
//Ок, такого объекта нет в базе, создаем его
MyObject* obj = [NSEntityDescription
insertNewObjectForEntityForName:@"MyObject"
inManagedObjectContext:self.managedObjectContext];
obj.id = new_id;
//заполняем другие поля...
}
[self.managedObjectContext save:nil]; //Сохраняем