简短回答:
您需要将此行添加到您的核心数据堆栈设置代码中:
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
长答案:我为此苦苦挣扎了一段时间,但我想我现在已经弄清楚了:
唯一约束 (UC) 不会阻止在上下文中创建重复项。只有当您尝试保存该上下文时,Core Data 才会检查 UC 的唯一性。
如果它为 UC 找到多个具有相同值的对象,则默认行为是抛出错误,因为冲突的默认合并策略是NSErrorMergePolicyType
. 该错误包含其 中的冲突对象userInfo.conflictList
,因此您可以手动解决冲突。
但大多数时候,您可能希望使用其他合并策略之一,并让 Core Data 自动合并冲突。这些合并策略之前确实存在,它们用于不同上下文中对象之间的冲突。也许这就是为什么在 WWDC Session 220 的 UC 功能的上下文中没有提到它们的原因。通常正确的选择是NSMergeByPropertyObjectTrumpMergePolicy
. 它基本上说“新数据胜过旧数据”,这是您在从外部源导入新数据时在常见场景中想要的。
(提示:首先我在验证这种行为时遇到了问题,因为重复的对象似乎保留在上下文中,直到保存操作完成 - 在我的情况下,这在后台队列中异步发生。所以如果你在点击后立即获取/计数你的对象保存按钮,您可能仍会看到重复项。)