在iPhone应用的CoreData中,是否有可能在多列上具有唯一约束?
例如:
所以问题是:
答案 0 :(得分:6)
要做
对于任何核心数据约束,您可以立即对多个单独的托管对象进行操作:
- (BOOL)validateForDelete:(NSError **)error
- (BOOL)validateForInsert:(NSError **)error
- (BOOL)validateForUpdate:(NSError **)error
(我通常有核心数据为实体制作.h和.m文件,然后为这样的事情制作我自己的类别,所以如果我稍后更改实体,我没有那么多工作)< / p>
如果你有什么东西只需要确保单个托管对象中的值是正确的,你可以使用-validate<Key>:error:
要做你想要的,我会使EventItems'validateForInsert / validateForUpdate 调用一个常用方法(也许是validateUniqueOrder)。在该方法中,我将使用从EventItems到Event的关系,然后获取与Event相关的所有EventItem,然后检查唯一性。我有很少的关系,所以我没有任何花哨的东西,但如果你有很多与给定事件相关的事件项,你可以查看NSFetchRequests的setPropertiesToFetch方法。或许你可以提出一个可以直接搜索重复值的查询(我从来没有,所以如果你这样做,请在这里回复以启发我)。
答案 1 :(得分:3)
如何在coredata中设置此约束?
您可以控制进入数据存储的内容,因此无论多么复杂,您都可以施加任何您喜欢的约束。但是Core Data不是一个数据库,它不会实现您通常在RDBMS中找到的各种自动约束。
如果没有直接支持任何建议重新如何以编程方式实施?
我会在代码中检查您创建或修改受影响对象的位置。在您的情况下,您可以为EventItem的'order'属性创建一个自定义setter,将建议的'order'与同一事件相关的所有其他EventItem的'order'进行比较。或者,您可以将检查放入事件中,并使用适当的访问器检查添加的任何新EventItem。
答案 2 :(得分:0)
唯一约束确保实体中的记录对于给定字段是唯一的。但是,在解决冲突的同时,独特的约束以及To-Many关系会导致许多奇怪的问题。
e.g。 “悬挂对无效对象的引用。”
这篇文章基本上是针对一个可能需要数天才能解决的小问题。
http://muhammadzahidimran.com/2016/12/08/coredata-unique-constraints-and-to-many-relationship/