为核心数据手动创建多对多关系中的中间表
Posted
技术标签:
【中文标题】为核心数据手动创建多对多关系中的中间表【英文标题】:Manually creating intermediate table in a many to many relationship for Core - Data 【发布时间】:2011-08-20 15:48:50 【问题描述】:我目前正在为一个 iPhone 项目使用 Core-data。
但我对一个元素有点困惑。
使用Core Data,目前您在创建多对多关系时不需要创建中间表(这一切都由核心数据在幕后处理)
但在我的情况下,我实际上需要我的多对多关系的一些属性!
例如
我有一张桌子叫Students
和另一个名为Lessons
的表
Student
可以是多个lessons
一个lesson
可以有多个students
现在标准的多对多关系对我不起作用,因为我实际上需要定义更多关于连接的细节,即StartDate
和LeaveDate
。
例如,在标准 sql 模型中,我的连接表将类似于
StudentLessons (Studentid, LessonId, StartDate, LeaveDate )
我需要这些属性,因为当我查询信息时,我需要连接中的详细信息来过滤我的结果。
如何在核心数据中创建它并过滤结果?
我看到有人说您实际上会在核心数据中手动创建StudentLesson
实体。
现在,如果我这样做,我是否只拥有属性(Startdate、LeaveDate)以及来自 Student 和 Lessons 表的一对多关系?
Student - > StudentLessons
Lesson - > StudentLessons
我想我对如何确保正确设置关系和关系的内容有点困惑。 (即,如果我将 Student
对象添加到 StudentLessons
- 那么我将如何分配/添加 Lesson
。)
抱歉,这是我第一次玩 Core Data。
从一个完整的 sql 后台开始需要一点时间来适应。
【问题讨论】:
【参考方案1】:你完全正确。正确的做法是创建一个新实体,如StudentLessons。我们称之为出勤率。它应该有startDate
和endDate
,以及两个关系。
与学生的关系可以是多对多的,除非可以预见每个学生的 startDate 和 endDate 总是不同的。一个带有日期的出席可以有很多学生。一名学生可以有多个出勤职责。
Student <<---->> Attendance
显然,与 Lesson 的关系应该是一对多的。一堂课可以有不同的出勤配置,有不同的日期。但是每个出席只属于一个课。
Lesson <---->> Attendance
为了解决您的问题,您可以将 Lesson 的 Attendance 属性设为非可选(反之亦然),这样可以确保每个 Lesson 至少有一个 Attendance 和适当的日期,并且每个 Attendance 恰好有一个 Lesson。
我认为您可以删除 Student 和 Lesson 之间的链接。只需分配一个出勤率而不是一堂课。如果您希望将 Lesson 分配给没有日期的 Student,只需允许 Attendance 将 NULL
作为这些属性。
【讨论】:
【参考方案2】:老虎,
Core Data 会为您创建一个连接表,但这并不意味着您必须使用它。除了您将创建中间实体然后使用适当的设置器来建立关系之外,保持哪个学生在哪个课程上成功是一样的。
您将不得不使用更多的关键路径并进行关系预取,但这些都很简单。
安德鲁
【讨论】:
谢谢 Andrew - 这些技术的任何可用示例? (又是核心数据的新手......) Apple 的网站上有很多例子。 Core Data 将推动你对 Objective-C 的了解。因此,它可以有很大的学习曲线。我建议你读几本关于 Core Data 的书之一。 Apple 的教程和编程指南也值得一读。以上是关于为核心数据手动创建多对多关系中的中间表的主要内容,如果未能解决你的问题,请参考以下文章
Python Django 多对多三种创建方式 form组件 cookie和session
Hibernate学习笔记 --- 创建基于中间关联表的多对多映射关系