Iphone CoreData(IOS)对多列的唯一约束?
在iPhone应用程序的CoreData中,是否可能对多个列具有唯一约束 例如:Iphone CoreData(IOS)对多列的唯一约束?,iphone,ios,core-data,Iphone,Ios,Core Data,在iPhone应用程序的CoreData中,是否可能对多个列具有唯一约束 例如: 具有事件、事件项、项实体 EventItems实体具有列顺序 因此,对于与同一事件相关的所有实例,EventItem的ORDER列应该是唯一的 因此,问题是: 如何在coredata中设置此约束 如果它不直接支持任何建议,那么我们该如何以编程的方式实施呢 如何在coredata中设置此约束 您可以控制进入数据存储的内容,因此可以施加任何您喜欢的约束,而不管约束有多复杂。但是核心数据不是一个数据库,它也没有实现您
- 具有事件、事件项、项实体
- EventItems实体具有列顺序
- 因此,对于与同一事件相关的所有实例,EventItem的ORDER列应该是唯一的
- (BOOL)validateForDelete:(NSError **)error
- (BOOL)validateForInsert:(NSError **)error
- (BOOL)validateForUpdate:(NSError **)error
(我通常让核心数据为实体创建一个.h和.m文件,然后为类似的内容创建我自己的类别,这样,如果我稍后更改实体,我就没有那么多工作了)
如果您有只需要确保单个托管对象中的值正确的内容,则可以使用-validate:error:
要实现您想要的功能,我将使用EventItems的validateForInsert/validateForUpdate
调用一个公共方法(可能是validateUniqueOrder)。在该方法中,我将使用从EventItems到Event的关系,然后获取与该事件相关的所有EventItems,然后检查唯一性。我有相当小的关系集,所以我不需要花太多心思,但是如果有很多事件项与给定的事件关联,那么可以研究NSFetchRequests的setPropertiesToFetch方法。或者,您可以提出一个查询,直接搜索重复的值(我从来没有这样做过,所以如果您这样做,请在这里回复以启发我)。唯一约束确保实体中的记录在给定字段中是唯一的。但在解决冲突时,独特的约束以及众多的关系导致了许多奇怪的问题 e、 g.“挂起对无效对象的引用。” 这篇文章主要关注一个可能需要几天才能解决的小问题
我想补充一点,当您在validateForInsert/Update:中使用NSFetchRequest确认唯一性时,请考虑您正在验证的对象已经在该上下文中,并且将出现在获取结果中。我花了一分钟才意识到:)