如何在iOS 9.0 Beta中实现新的Core Data模型构build器的“独特”属性
在WWDC15video会议“核心数据的新特性”中,苹果工程师在10:45分钟(介绍中)描述了模型生成器的一个新function,允许您指定独特的属性。 一旦你设置了这些独特的属性,核心数据将不会使用该属性创build一个重复的对象。 这是假设消除需要检查之前,如果一个相同的对象创build一个新的对象。
我一直在尝试这个,但没有运气阻止具有相同的“唯一”属性(重复对象)的新对象的创build。 除了5分钟的video解释,我还没有find任何其他信息来描述如何使用这个function。
有没有人有任何经验在核心数据模型中实现“唯一”属性属性?
简短的回答:您需要将此行添加到您的核心数据堆栈设置代码:
managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
很长的回答:我已经有一段时间了,但我想我现在已经明白了:
唯一约束(UC)不会阻止在上下文中创build重复项。 只有当您尝试保存上下文时,Core Data才会检查UCs的唯一性。
如果find多个具有相同UC值的对象,则默认行为是抛出错误,因为冲突的默认合并策略是NSErrorMergePolicyType
。 该错误包含userInfo.conflictList
中的冲突对象,因此您可以手动解决冲突。
但大多数情况下,您可能想要使用其他合并策略之一,并让Core Data自动合并冲突。 这些合并策略之前确实存在,它们用于不同上下文中的对象之间的冲突。 也许这就是为什么他们没有在WWDC会话220的UCfunction的上下文中提到。通常正确的select是NSMergeByPropertyObjectTrumpMergePolicy
。 它基本上是说“新数据胜过旧数据”,当您从外部来源导入新数据时,这是您在常见情况下想要的。
(提示:首先我有问题来validation这种行为,因为重复的对象似乎留在上下文中,直到保存操作完成 – 在我的情况下,在后台队列中asynchronous发生。所以如果你击中后立即获取/计数你的对象保存button,你可能仍然看到重复。)
我不知道正确的答案,因为这是一个testing版本,但玩了一分钟后,我find了一个方法使其工作:
-
告诉模型哪些属性形成了唯一约束,完全如您在问题中所显示的图片所示。
-
添加新logging:
let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag
-
将值分配给参数。
-
保存您的更改:
do { try context.save() } catch let error as NSError { print("Error: \(error.localizedDescription)") context.reset() }
关键是在catch
块。 如果发生错误,请将上下文重置为以前的状态。 由于保存操作失败,重复logging将不存在。
请注意,您应该检查错误,看看是否是由重复logging引起的。
我希望这有帮助。
- 获取关系并显示在UITableView中
- 核心数据每次获取时都会为同一个NSManagedObject返回一个不同的对象实例。 为什么是这样?
- 为实体插入新的对象的CoreData给我错误时使用setValue:forKey:与一个int
- 核心数据:从多个实体或关系获取结果
- NSPersistentStoreCoordinator在读取特定NSManagedProperty后释放NSManagedObject时抛出EXC_BAD_ACCESS
- NSPredicate在swift 3迁移后崩溃
- 抽象实体的核心数据关系
- 如何观察是否从managedObjectContext中删除了NSManagedObject
- iOS:自然sorting顺序