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

vin*_*nce 9 core-data ios xcode7

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

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

在此输入图像描述

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

Dor*_*Roy 12

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

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

答案长:我在这方面挣扎了一段时间,但我想我现在已经弄明白了:

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

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

但大多数情况下,您可能希望使用其他合并策略之一,并让Core Data自动合并冲突.这些合并策略之前确实存在,它们用于不同上下文中的对象之间的冲突.也许这就是为什么在WWDC Session 220的UC功能环境中没有提到它们.通常正确的选择是NSMergeByPropertyObjectTrumpMergePolicy.它基本上表示"新数据胜过旧数据",这是您在从外部源导入新数据时在常见情况下的需求.

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


enr*_*eas 0

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

  1. 告诉模型哪些属性形成唯一约束,正如您问题中的图像所示。

  2. 添加新记录:

let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag
Run Code Online (Sandbox Code Playgroud)
  1. 将值分配给属性。

  2. 保存您的更改:

do {
  try context.save()
} catch let error as NSError {
  print("Error: \(error.localizedDescription)")
  context.reset()
}
Run Code Online (Sandbox Code Playgroud)

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

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

我希望这有帮助。