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
.它基本上表示"新数据胜过旧数据",这是您在从外部源导入新数据时在常见情况下的需求.
(提示:首先我在验证此行为时遇到问题,因为重复对象似乎保留在上下文中,直到保存操作完成 - 在我的情况下,在后台队列中异步发生.所以如果你在点击后立即获取/计算你的对象保存按钮,您可能仍会看到重复项.)
我不知道正确的答案,因为这是测试版,但在玩了一分钟后,我找到了一种让它工作的方法:
告诉模型哪些属性形成唯一约束,正如您问题中的图像所示。
添加新记录:
let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag
Run Code Online (Sandbox Code Playgroud)
将值分配给属性。
保存您的更改:
do {
try context.save()
} catch let error as NSError {
print("Error: \(error.localizedDescription)")
context.reset()
}
Run Code Online (Sandbox Code Playgroud)
钥匙就在catch
区块里。如果发生错误,请将上下文重置为之前的状态。由于保存操作失败,重复记录将不存在。
请注意,您应该检查错误是否是由重复记录引起的。
我希望这有帮助。
归档时间: |
|
查看次数: |
1627 次 |
最近记录: |