CoreData(IOS)多列的唯一约束?

Posted

技术标签:

【中文标题】CoreData(IOS)多列的唯一约束?【英文标题】:CoreData (IOS) Unique Constraint on Multiple columns? 【发布时间】:2011-12-05 01:23:43 【问题描述】:

是否可以在 iPhone 应用的 CoreData 中对多列有唯一约束?

例如:

拥有 Event、EventItems、Items 实体 EventItems 实体有一列 ORDER 因此 EventItem 的 ORDER 列对于与同一 EVENT 相关的所有实例应该是唯一的

所以问题是:

    如何在 coredata 中设置此约束? 如果不直接支持有关如何以编程方式实施的任何建议?

【问题讨论】:

【参考方案1】:

待办事项

对于任何一次对多个托管对象进行操作的核心数据约束,您希望查看实现:

- (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 方法。或者,也许您可​​以提出一个可以直接搜索重复值的查询(我从来没有,所以如果您这样做,请在此处回复以启发我)。

【讨论】:

我想补充一点,当您使用 NSFetchRequest 来确认 validateForInsert/Update: 中的唯一性时,请考虑到您正在验证的对象已经在该上下文中并将出现在获取结果中.我花了一分钟才意识到:)【参考方案2】:

如何在 coredata 中设置这个约束?

您可以控制进入数据存储的内容,因此无论多么复杂,您都可以施加任何您喜欢的约束。但 Core Data 不是数据库,它没有实现您通常在 RDBMS 中找到的那种自动约束。

如果它不直接支持有关如何以编程方式实施的任何建议?

我会在您的代码中创建或修改受影响对象的位置进行检查。在您的情况下,您可以为 EventItem 的“订单”属性创建一个自定义设置器,将建议的“订单”与与同一事件相关的所有其他 EventItem 的“订单”进行比较。或者,您可以将检查放在 Event 中,并使用适当的访问器检查添加的任何新 EventItem。

【讨论】:

【参考方案3】:

唯一约束确保实体中的记录在给定字段中是唯一的。但是,独特的约束以及多对多关系在解决冲突时会导致许多奇怪的问题。

例如“对无效对象的悬空引用。”

这篇文章主要关注一个可能需要几天时间才能解决的小问题。

http://muhammadzahidimran.com/2016/12/08/coredata-unique-constraints-and-to-many-relationship/

【讨论】:

以上是关于CoreData(IOS)多列的唯一约束?的主要内容,如果未能解决你的问题,请参考以下文章

唯一性约束功能需要 ios 部署目标 9.0 或更高版本 - Core Data

多列的唯一约束

mysql中多列的唯一约束[重复]

实体框架中多列的唯一键约束

PostgreSQL:基于多列唯一约束的自增

在多列上创建复合唯一约束