核心数据:检查属性唯一性的最佳方法

时间:2014-12-18 14:09:11

标签: ios core-data unique nsmanagedobject key-value-observing

据我所知,无法通过Core Data将实体的属性设置为唯一,无论是以编程方式还是在Xcode的编辑器中......我都需要确保无法创建某些托管对象如果与我希望独特的属性值发生冲突,我一直在阅读一些与之相关的帖子。

我找到了几种方法(例如Core Data unique attributes):

  1. 使用-validateValue:forKey:error:
  2. 编写某种自定义方法以检查属性的值是否已存在
  3. 最值得推荐的选择是什么?

    由于

1 个答案:

答案 0 :(得分:1)

您需要某种自定义代码,无论是将其放在validateValue:forKey:error:中,还是放在自定义方法中,还是放在其他位置。

是否使用内置验证方法实际上是您喜欢组织代码的方式。我更喜欢做像

这样的事情
  1. 检查值是否唯一。
  2. 如果是,则插入新实例。
  3. 这部分是因为我发现内置的验证方案很痛苦,但主要是因为每次保存对象的更改时代码都会运行。如果您的支票位于validateValue:forKey:error:,即使您确认该值是唯一的,也会重复运行。那么也许你需要这样做,所以在你的情况下最好的答案取决于你的应用程序需要如何工作的更大的图片。

    进行验证的简单方法是使用谓词进行提取,以识别需要检查的键和值。我对另一个答案中描述的共同提取方法所做的一个改变是我使用countForFetchRequest:error:而不是executeFetchRequest:error:。听起来你实际上并不需要在验证期间获取现有对象,你只需要知道是否存在,所以只需检查它。

    根据唯一属性的类型,您可以通过执行此操作来降低您将要执行的性能损失。例如,如果它是一个字符串。检查所有现有字符串是否相对昂贵。另一方面,检查一堆现有的整数是便宜的。在这种情况下,您可能会发现将数值属性添加到存储唯一字符串值的数字哈希的实体类型是值得的。仅在检查唯一性时使用哈希。它比寻找匹配的字符串要快得多,NSString甚至有一个方便的hash方法来为你计算值。