单向一对多的核心数据关系
Core Data Relationship For Unidirectional One to Many
在 Core Data 中创建单向一对多关系的最佳实践是什么?
例如...
让我们举两个经典的实体例子,"teacher"和"student".
每个学生有一个老师,每个老师有很多学生。
现在在 CoreData 中,您 被迫提供逆向 ,这样老师就不得不引用 'student'。如果你不这样做,你会得到一个很好的警告,它说的是......
file:///Users/josephastrahan/Documents/VisualStudioProjects/Swift3WorkOrders/WorkOrders/WorkOrders/WorkOrders.xcdatamodeld/WorkOrders.xcdatamodel/: warning: Misconfigured Property: Teacher.student should have an inverse
如果我不想让老师引用学生怎么办?
其他一些帖子提出 无论如何我都应该允许反转,但我认为这种反转可能会导致我的一个项目出现问题。
也就是说,让我解释一下我的确切问题。
假设我们的老师有一个名为 'id' 的独特属性 int64。可以说学生也有独特的属性 int64 称为 'id'.
通过在模型上为 teacher on id 添加约束来强制 int64 是唯一的。(请参阅下图以了解如何完成)
每年都有新的学生,但老师没有变。所以我决定在不删除对老师的引用的情况下删除所有学生。 所以我将师生关系的删除规则设置为'nullify',师生关系的删除规则设置为'nullify'。
现在,当我创建一个新学生时,我想将现有教师之一分配给该学生...(类似于 student.teacher = 带有 id 的教师对象1 或与以前相同的 id) however!! , 因为老师与不再存在的学生有反向关系(理论上应该为空)程序崩溃了!
我知道是这种情况,因为我使用打印控制台日志来缩小它发生的确切位置。我也知道这一点,因为如果我为学生添加级联删除规则,崩溃就会消失但是......然后我失去了我的老师!我不想要...
我认为可能是问题所在的一些事情:
1.) 当我进行测试时,我会在程序启动时进行测试,每次都会创建一个新的上下文。会不会因为我从未删除过老师,它仍然认为它指的是来自不再存在的上下文中的学生? (如果我什至说得对...)
我不确定用 Coredata 实现我想做的事情的最佳解决方案,非常感谢任何建议!
注:
忘了说我还有合并策略:NSMergeByPropertyObjectTrumpMergePolicy,它将用新数据覆盖旧数据。 当我创建新学生时,我也在创建新教师时也只是使用应遵循此政策的相同 ID。
你快到了。
- 保持反向关系的建议很好。保留它。
- 您的问题可能是由不同的上下文引起的。与其在内存中保留一个教师对象,不如在您打算使用它的上下文中获取教师(基于 id)。
- 您取消的学生应该不会有任何影响。一对多关系实际上是
Set<Student>
。确保集合为空。
注意事项:
如果你想保留数据库中的学生(出于历史目的) - 从你的描述看来是这种情况 - 你也可以考虑另一种方案:给你的学生另一个属性(例如一年)并使用它来过滤学生列表。您不必删除或取消任何内容。您还可以对数据进行一些更有趣的基于时间的查询。
iOS9 可以使用唯一约束。这帮助 iOS 开发人员在 CoreData 中添加和更新记录。
唯一约束确保实体中的记录在给定字段中是唯一的。但是独特的约束以及一对多关系在解决冲突时会导致很多奇怪的问题。
例如“对无效对象的悬挂引用。”
这个 post 主要是针对可能需要几天才能解决的小问题。
http://muhammadzahidimran.com/2016/12/08/coredata-unique-constraints-and-to-many-relationship/
在 Core Data 中创建单向一对多关系的最佳实践是什么?
例如...
让我们举两个经典的实体例子,"teacher"和"student".
每个学生有一个老师,每个老师有很多学生。
现在在 CoreData 中,您 被迫提供逆向 ,这样老师就不得不引用 'student'。如果你不这样做,你会得到一个很好的警告,它说的是......
file:///Users/josephastrahan/Documents/VisualStudioProjects/Swift3WorkOrders/WorkOrders/WorkOrders/WorkOrders.xcdatamodeld/WorkOrders.xcdatamodel/: warning: Misconfigured Property: Teacher.student should have an inverse
如果我不想让老师引用学生怎么办?
其他一些帖子提出 无论如何我都应该允许反转,但我认为这种反转可能会导致我的一个项目出现问题。
也就是说,让我解释一下我的确切问题。
假设我们的老师有一个名为 'id' 的独特属性 int64。可以说学生也有独特的属性 int64 称为 'id'.
通过在模型上为 teacher on id 添加约束来强制 int64 是唯一的。(请参阅下图以了解如何完成)
每年都有新的学生,但老师没有变。所以我决定在不删除对老师的引用的情况下删除所有学生。 所以我将师生关系的删除规则设置为'nullify',师生关系的删除规则设置为'nullify'。
现在,当我创建一个新学生时,我想将现有教师之一分配给该学生...(类似于 student.teacher = 带有 id 的教师对象1 或与以前相同的 id) however!! , 因为老师与不再存在的学生有反向关系(理论上应该为空)程序崩溃了!
我知道是这种情况,因为我使用打印控制台日志来缩小它发生的确切位置。我也知道这一点,因为如果我为学生添加级联删除规则,崩溃就会消失但是......然后我失去了我的老师!我不想要...
我认为可能是问题所在的一些事情:
1.) 当我进行测试时,我会在程序启动时进行测试,每次都会创建一个新的上下文。会不会因为我从未删除过老师,它仍然认为它指的是来自不再存在的上下文中的学生? (如果我什至说得对...)
我不确定用 Coredata 实现我想做的事情的最佳解决方案,非常感谢任何建议!
注:
忘了说我还有合并策略:NSMergeByPropertyObjectTrumpMergePolicy,它将用新数据覆盖旧数据。 当我创建新学生时,我也在创建新教师时也只是使用应遵循此政策的相同 ID。
你快到了。
- 保持反向关系的建议很好。保留它。
- 您的问题可能是由不同的上下文引起的。与其在内存中保留一个教师对象,不如在您打算使用它的上下文中获取教师(基于 id)。
- 您取消的学生应该不会有任何影响。一对多关系实际上是
Set<Student>
。确保集合为空。
注意事项:
如果你想保留数据库中的学生(出于历史目的) - 从你的描述看来是这种情况 - 你也可以考虑另一种方案:给你的学生另一个属性(例如一年)并使用它来过滤学生列表。您不必删除或取消任何内容。您还可以对数据进行一些更有趣的基于时间的查询。
iOS9 可以使用唯一约束。这帮助 iOS 开发人员在 CoreData 中添加和更新记录。
唯一约束确保实体中的记录在给定字段中是唯一的。但是独特的约束以及一对多关系在解决冲突时会导致很多奇怪的问题。
例如“对无效对象的悬挂引用。”
这个 post 主要是针对可能需要几天才能解决的小问题。
http://muhammadzahidimran.com/2016/12/08/coredata-unique-constraints-and-to-many-relationship/