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

时间:2014-01-15 06:23:47

标签: ios core-data

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

3 个答案:

答案 0 :(得分:84)

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

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

[managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];

“Swift版本”完全相同

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

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

enter image description here

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

可以找到此演示的示例代码here

答案 1 :(得分:9)

快速解决方案:

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

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

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

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

注意:当您执行managedObjectContext.save()而不是仅仅将对象添加到托管对象时,会检查唯一性。

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

答案 2 :(得分:-1)

快速版本很容易 免责声明:如果您有冲突的信息,请删除实施条款。其他应用程序将无法运行。 解决方案从设备中删除,然后重新开始

步骤是:

  1. 打开核心数据文件(projectname.xcdatamodeld)
  2. 单击实体名称(需要突出显示)
  3. 屏幕的右侧(在班级部分)查找约束(点击加号按钮)
  4. 右键单击以将信息重命名为属性。

//现在将代码添加到您的核心数据容器中

  1. 打开AppDelegate.swift文件并滚动到coredata堆栈中(“ // MARK:-Core Data Saving support”)
  2. 更新静态函数saveContext()的代码{let variable = persistentContainer.viewContext“

//现在进行此简单的调用来管理更新过程

变量”。mergePolicy= NSMergeByPropertyObjectTrumpMergePolicy”

//理解清楚

静态函数saveContext(){

    let context = persistentContainer.viewContext

    context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy // you need this line
    if context.hasChanges {
        do {
          try context.save()
        } catch {