【发布时间】:2011-12-05 01:23:43
【问题描述】:
是否可以在 iPhone 应用的 CoreData 中对多列有唯一约束?
例如:
- 拥有 Event、EventItems、Items 实体
- EventItems 实体有一列 ORDER
- 因此 EventItem 的 ORDER 列对于与同一 EVENT 相关的所有实例应该是唯一的
所以问题是:
- 如何在 coredata 中设置此约束?
- 如果不直接支持有关如何以编程方式实施的任何建议?
【问题讨论】:
是否可以在 iPhone 应用的 CoreData 中对多列有唯一约束?
例如:
所以问题是:
【问题讨论】:
待办事项
对于任何一次对多个托管对象进行操作的核心数据约束,您希望查看实现:
- (BOOL)validateForDelete:(NSError **)error
- (BOOL)validateForInsert:(NSError **)error
- (BOOL)validateForUpdate:(NSError **)error
(我通常让核心数据为实体创建一个 .h 和 .m 文件,然后为此类事情创建自己的类别,因此如果稍后更改实体,我就没有那么多工作了)
如果您只需要确保单个托管对象中的值是正确的,您可以使用-validate<Key>:error:
要做你正在寻找的我会让 EventItems' validateForInsert/validateForUpdate 调用一个通用方法(可能是 validateUniqueOrder)。在该方法中,我将使用从 EventItems 到 Event 的关系,然后获取与 Event 相关的所有 EventItems,然后检查唯一性。我有相当少的关系集,所以我没有为任何花哨的事情烦恼,但如果你有很多与给定事件相关的事件项,你可能会查看 NSFetchRequests 的 setPropertiesToFetch 方法。或者,也许您可以提出一个可以直接搜索重复值的查询(我从来没有,所以如果您这样做,请在此处回复以启发我)。
【讨论】:
如何在 coredata 中设置这个约束?
您可以控制进入数据存储的内容,因此无论多么复杂,您都可以施加任何您喜欢的约束。但 Core Data 不是数据库,它没有实现您通常在 RDBMS 中找到的那种自动约束。
如果它不直接支持有关如何以编程方式实施的任何建议?
我会在您的代码中创建或修改受影响对象的位置进行检查。在您的情况下,您可以为 EventItem 的“订单”属性创建一个自定义设置器,将建议的“订单”与与同一事件相关的所有其他 EventItem 的“订单”进行比较。或者,您可以将检查放在 Event 中,并使用适当的访问器检查添加的任何新 EventItem。
【讨论】:
唯一约束确保实体中的记录在给定字段中是唯一的。但是,独特的约束以及多对多关系在解决冲突时会导致许多奇怪的问题。
例如“对无效对象的悬空引用。”
这篇文章主要关注一个可能需要几天时间才能解决的小问题。
http://muhammadzahidimran.com/2016/12/08/coredata-unique-constraints-and-to-many-relationship/
【讨论】: