单向一对多的核心数据关系

时间:2016-11-07 03:20:08

标签: ios swift core-data swift3 one-to-many

在核心数据中创建单向一对多关系的最佳做法是什么?

例如......

让我们举两个经典的实体例子,“老师”“学生”

每个学生都有一位老师,每位老师都有很多学生。

现在,在CoreData中,被迫提供反向,以便教师被迫引用“学生”。如果你不这样做,你会得到一个很好的警告,说明了......

file:///Users/josephastrahan/Documents/VisualStudioProjects/Swift3WorkOrders/WorkOrders/WorkOrders/WorkOrders.xcdatamodeld/WorkOrders.xcdatamodel/: warning: Misconfigured Property: Teacher.student should have an inverse

如果我不希望老师提及学生,该怎么办?

其他一些帖子提到了我应该允许反向,但我认为这反过来可能导致我的一个项目出现问题。

那就是让我解释我的确切问题。

让我们说我们的老师有一个名为'id'的唯一属性int64。让我们说学生们还有一个名为'id'的唯一属性int64。

通过在id为教师的模型上添加约束来强制执行int64。(请参阅下面的图片以了解如何完成)

enter image description here

每年都有新生,但老师保持不变。所以我决定删除所有学生而不删除对老师的引用。 因此,我将删除规则设置为“nullify”,用于教师与学生的关系,并将“取消”为学生与教师

现在,当我创建一个新学生时,我想将一个现有教师分配给该学生 ...(类似于student.teacher =教师对象,其id为1或同一个id为之前)然而!! 因为教师与不再存在的学生(理论上应该为空)有反向关系,程序崩溃了!

我知道就是这种情况,因为我已经使用了打印控制台日志来缩小它发生的确切点。我也知道这一点,因为如果我为学生添加级联的删除规则,崩溃将会消失但是...然后我失去了我的老师!我不想要......

我认为可能是一些问题:

1。)当我进行测试时,我会在程序启动时执行此操作,每次都会创建一个新的上下文。可能是因为我从未删除老师,它仍然认为它指的是一个不再存在的背景的学生? (如果我甚至说这是对的......)

我不确定使用Coredata实现我正在尝试做什么的最佳解决方案,我们非常感谢任何建议!

注意:

忘记提及我还有以下的合并政策: NSMergeByPropertyObjectTrumpMergePolicy ,它将用新的覆盖旧数据。 当我创建新学生时,我正在创建新教师,也只是使用与此政策相同的ID。

2 个答案:

答案 0 :(得分:1)

你快到了。

  1. 保持反向关系的建议很好。保持它。
  2. 您的问题可能是由不同的背景引起的。您不应该在内存中保留教师对象,而应该在您打算使用它的上下文中获取教师(基于id)。
  3. 您的无效学生不应有任何影响。多对多关系实际上是Set<Student>。确保该集合为空。
  4. NB
    如果您想保留数据库中的学生(出于历史目的) - 从您的描述中可能出现这种情况 - 您可能还会考虑另一种方案:为您的学生提供另一个属性(例如年)并使用它来过滤学生名单。您不必删除或取消任何内容。您还可以对数据进行一些更有趣的基于时间的查询。

答案 1 :(得分:0)

iOS9提供唯一约束。这有助于iOS开发者在CoreData中添加和更新记录。

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

e.g。 “悬挂对无效对象的引用。”

这篇文章基本上是针对一个可能需要数天才能解决的小问题。

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