如何为核心数据中的某些字段添加唯一约束

我是iOS开发的新手,我使用XCode 5.02进行开发。 我有一些实体(例如,用户),我需要为他的名字设置唯一的约束,但我无法通过可视化编辑器find我可以做到的。 是否可以通过GUI来完成? 或者只能通过代码? 感谢提前。 如果有可能我会很高兴得到一些截图。

在iOS 9中,这实际上已经发生了变化 – 苹果增加了对实体添加唯一约束的function。 我写了一篇博客文章解释如何设置。


tl; dr ,在核心数据编辑器中select一个实体时,边栏中有一个新的部分。 你可以设置你想在实体的所有实例中唯一的约束

要在保存期间自动解决冲突问题,您需要确保已经为您的托pipe对象上下文设置了合并策略,否则保存时就会出错(实际上可能是您想要的)

_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; 

请记住冲突解决只发生在保存期间,而不是插入。 所以,如果你正在使用NSFetchedResultsController,你会看到插入的实体具有非唯一约束。

在这里输入图像说明

如果你想确保你的pipe理对象上下文中没有非唯一约束的实体而没有保存(如果你正在使用FRC), 这个答案仍然是最好的方法。 虽然,请记住,如果你做了大量的插入操作,代价很大,因为NSFetchRequests是昂贵的操作。

Swift解决scheme:

正如在其他答案中指出的,你可以在iOS9之后的核心数据中有独特的限制。

要做到这一点,首先从核心数据编辑器添加约束到实体(Zachary的答案解释)。

然后在代码中添加这一行:

 managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

注意:只有当你添加对象到托pipe对象时,才会检查唯一性,而不是在执行managedObjectContext.save()时检查。

NSMergeByPropertyObjectTrumpMergePolicy只是合并策略之一,它会覆盖旧值。 您可能需要检查其他选项的文档。