Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CoreData(IOS)对多列的唯一约束?_Iphone_Ios_Core Data - Fatal编程技术网

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

Iphone CoreData(IOS)对多列的唯一约束?,iphone,ios,core-data,Iphone,Ios,Core Data,在iPhone应用程序的CoreData中,是否可能对多个列具有唯一约束 例如: 具有事件、事件项、项实体 EventItems实体具有列顺序 因此,对于与同一事件相关的所有实例,EventItem的ORDER列应该是唯一的 因此,问题是: 如何在coredata中设置此约束 如果它不直接支持任何建议,那么我们该如何以编程的方式实施呢 如何在coredata中设置此约束 您可以控制进入数据存储的内容,因此可以施加任何您喜欢的约束,而不管约束有多复杂。但是核心数据不是一个数据库,它也没有实现您

在iPhone应用程序的CoreData中,是否可能对多个列具有唯一约束

例如:

  • 具有事件、事件项、项实体
  • EventItems实体具有列顺序
  • 因此,对于与同一事件相关的所有实例,EventItem的ORDER列应该是唯一的
因此,问题是:

  • 如何在coredata中设置此约束
  • 如果它不直接支持任何建议,那么我们该如何以编程的方式实施呢 如何在coredata中设置此约束

    您可以控制进入数据存储的内容,因此可以施加任何您喜欢的约束,而不管约束有多复杂。但是核心数据不是一个数据库,它也没有实现您通常在RDBMS中找到的自动约束

    如果它不直接支持任何建议,那么我们该如何以编程的方式实施呢

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

    要执行的操作

    对于同时在多个受管对象上运行的任何核心数据约束,您希望了解如何实现:

    - (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确认唯一性时,请考虑您正在验证的对象已经在该上下文中,并且将出现在获取结果中。我花了一分钟才意识到:)