如何为Core Data中的某些字段添加唯一约束

mal*_*uri 44 core-data ios

我使用Xcode进行iOS开发.我有一些实体(例如,User),我需要为他的名字设置唯一约束,但我找不到如何通过可视化编辑器来实现它.是否可以通过GUI完成?或者只能通过代码?我很乐意得到一些截图.

Zac*_*Orr 89

在编辑器中为Core Data选择实体时,侧栏中有一个新部分.您可以在实体的所有实例中设置要唯一的约束

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

[managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
Run Code Online (Sandbox Code Playgroud)

"Swift版本"完全相同

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
Run Code Online (Sandbox Code Playgroud)

请记住,冲突解决只发生在保存期间,而不是插入.因此,如果您正在使用NSFetchedResultsController,您将看到插入时具有非唯一约束的实体.

在此输入图像描述

如果您想确保在托管对象上下文中没有任何具有非唯一约束的实体而未保存(如果您正在使用FRC),则此答案仍可能是最佳方法.虽然,请记住,如果你进行大量插入操作会很昂贵,因为NSFetchRequests是昂贵的操作.

可以在此处找到此演示的示例代码

  • 请记住,必须仅为`String`类型设置唯一约束. (5认同)

Nit*_*ain 11

Swift解决方案:

如在另一个答案中所述,您可以在iOS9的Core Data中具有唯一约束.

为此,首先从核心数据编辑器向实体添加约束(Zachary的答案中的解释).

然后在代码中添加以下行:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
Run Code Online (Sandbox Code Playgroud)

注意:当您managedObjectContext.save()只是将对象添加到托管对象时,将检查唯一性.

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

  • 你想告诉用户一些重复的用户体验?可能使用 NSErrorMergePolicy https://developer.apple.com/documentation/coredata/nserrormergepolicy 。捕获返回值,然后执行您的自定义逻辑。 (2认同)