如何在iOS 9.0 Beta中实现新的Core Data模型构建器“unique”属性

时间:2015-06-17 14:08:36

标签: ios core-data xcode7

在WWDC15视频会话中,'What's New in Core Data'在10:45分钟(进入演示文稿),Apple工程师描述了模型构建器的一个新功能,允许您指定唯一属性。设置这些唯一属性后,Core Data将不会使用该属性创建重复对象。这假设在创建新对象之前无需检查是否存在相同的对象。

我一直在尝试这个但是没有运气阻止创建具有相同“唯一”属性(重复对象)的新对象。除了5分钟的视频说明外,我还没有找到任何其他信息来描述如何使用此功能。

enter image description here

有没有人在核心数据模型中实现'unique'properties属性?

2 个答案:

答案 0 :(得分:12)

简答: 您需要将此行添加到Core Data堆栈设置代码中:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

答案很长:我已经挣扎了一段时间,但我想我现在已经弄清楚了:

唯一约束(UC)不会阻止在上下文中创建重复项。只有当您尝试保存该上下文时,Core Data才会检查UC的唯一性。

如果找到多个具有相同UC值的对象,则默认行为是抛出错误,因为冲突的默认合并策略为NSErrorMergePolicyType。该错误包含其userInfo.conflictList中的冲突对象,因此您可以手动解决冲突。

但是大多数时候你可能想要使用其他merge policies之一,让Core Data自动合并冲突。这些合并策略之前确实存在,它们用于不同上下文中的对象之间的冲突。也许这就是为什么在WWDC Session 220的UC功能的背景下没有提到它们。通常正确的选择是NSMergeByPropertyObjectTrumpMergePolicy。它基本上说“新数据胜过旧数据”,这是从外部源导入新数据时常见情况下的所需。

(提示:首先我在验证此行为时遇到问题,因为重复对象似乎保留在上下文中,直到保存操作完成 - 在我的情况下,在后台队列中异步发生。因此,如果您获取/计算对象在点击保存按钮后,您可能仍会看到重复项。)

答案 1 :(得分:-1)

我不知道正确的答案,因为这是一个测试版,但在玩了一分钟之后,我找到了一种让它工作的方法:

  1. 告诉模型哪些属性构成了唯一约束,完全如您在问题中所示的图像所示。

  2. 添加新记录:

  3. let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag
    1. 将值分配给attribues。

    2. 保存更改:

    3. do {
        try context.save()
      } catch let error as NSError {
        print("Error: \(error.localizedDescription)")
        context.reset()
      }

      密钥位于catch块中。如果发生错误,请将上下文重置为先前的状态。由于保存操作失败,重复记录将不存在。

      请注意,您应该检查错误,看它是否是由重复的记录引起的。

      我希望这会有所帮助。