如何为核心数据中的某些字段添加唯一约束
我是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
只是合并策略之一,它会覆盖旧值。 您可能需要检查其他选项的文档。
- 如何使用当前的NSPersistentStore方法在本地和iCloud中创build可共享的Core Data .sqlite备份
- 核心数据关系:如何将新对象插入到实体中,并与另一个实体中的现有对象build立关系
- 无法用types参数列表(Int64,String)调用setValue
- NSManagedObjectContext executeFetchRequest返回不稳定的对象,导致EXC_BAD_ACCESS,SIGABRT等
- coredata sqlite – 在应用程序更新中添加logging
- 核心数据每次获取时都会为同一个NSManagedObject返回一个不同的对象实例。 为什么是这样?
- 核心数据严重的应用程序错误在controllerDidChangeContent
- 核心数据NSManagedObject没有有效的NSEntityDescription
- 为什么这段代码引起“CoreData:error:(19)PRIMARY KEY必须是唯一的”错误?