【问题标题】:Core Data Unique constraint except for the default value核心数据唯一约束,默认值除外
【发布时间】:2018-01-03 00:43:12
【问题描述】:

我有一个名为“Person”的实体。它有一个属性“id”,默认值 = 0。我在“Person”中设置了一个约束,只有唯一的 Id。我正在从服务器加载人员列表并使用核心数据将它们存储在本地。 Person ids 应该是唯一的,但是当我在本地创建多个人时,如果默认值为 0,我希望忽略 id 的唯一性。

我只想让唯一性约束对每个 id 都不同,然后 0,我该怎么做?

谢谢,

【问题讨论】:

  • 您的意思是要允许多个 id 为 0 的条目?
  • 是的,这就是我的意思,如果 id == 0 => 允许 else 覆盖(我正在使用合并策略,因此即使 id 为 == 0,覆盖也始终有效。跨度>
  • @MeMTn 你有多个 nil 值的文档参考吗?

标签: ios swift xcode core-data swift3


【解决方案1】:

Core Data 的唯一性约束就是——它们要求唯一性,没有例外。 Core Data 不直接支持您想要“除了一个可以复制的值之外唯一”的情况。您必须以某种方式在自己的代码中维护它。这可能意味着实现您自己的更新或插入逻辑来检查 ID 是否存在。就是这样,

  1. 使用特定 ID 进行提取。
  2. 如果您找到一个对象,请更新它。
  3. 如果找不到对象,请创建一个新对象。

【讨论】:

  • 我解决的方法有点不同,我注意到你可以有多个 id = null 的人,所以我将默认 id 值设置为 null,所以我不必增加 id我自己。无论如何谢谢:)
  • 哦,如果没有 ID 也没关系,那就不一样了。 :)
【解决方案2】:

在添加到核心数据的约束之前,确保唯一性的唯一方法是进行提取,然后如果没有结果则创建对象。这并不难做到。在您的代码中强制执行唯一性并使用您需要的任何自定义逻辑。尝试组织您的代码,以便只有一种或两种方法可以创建一个人,以便逻辑更容易处理。

【讨论】:

  • 唯一性约束和合并策略确实为 Core Data 实现了“更新或插入”,并且不需要在代码中强制执行。
  • @TomHarrington 是正确的,如果你有一个合并策略,如果已经存在的托管对象具有相同的 id(这是我的唯一性约束),它们将被新的托管对象覆盖。我使用 managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 作为合并策略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2012-06-18
相关资源
最近更新 更多