为Core - Data手动创建多对多关系的中间表

时间:2011-08-20 15:48:50

标签: iphone sql core-data

我目前正在为一个iPhone项目使用Core-data。

但我对一个元素感到有点困惑。

使用核心数据目前,您无需在创建多对多关系时创建中间表(它全部由核心数据在幕后处理)

但在我的情况下,我实际上需要一些关于我的多对多关系的属性!

例如

我有一张名为Students的表格 和另一个名为Lessons

的表

Student可以有很多lessons lesson可以有多个students

现在标准的多对多关系对我不起作用,因为我实际上需要定义关于连接的更多细节,即StartDateLeaveDate

在标准的sql模型中,例如我的连接表就像

StudentLessons (Studentid, LessonId, StartDate, LeaveDate )

我需要这些属性,因为当我查询信息时,我需要联接中的详细信息来过滤我的结果。

如何在核心数据中创建此内容并过滤结果?

我见过人们说你实际上会在核心数据中手动创建StudentLesson实体。

现在,如果我这样做,我会拥有属性(Startdate,LeaveDate),然后是Student和Lessons表中的一对多关系吗?

Student - > StudentLessons
Lesson - > StudentLessons

我想我对如何确保正确设置关系和关系内容感到困惑。 (即如果我将Student对象添加到StudentLessons - 我将如何分配/添加Lesson。)

很抱歉这是我第一次玩核心数据。

在sql背景上来自完整的时候需要习惯。

2 个答案:

答案 0 :(得分:2)

你是对的。正确的方法是创建新实体,例如 StudentLessons 。我们称之为出席。它应该有startDateendDate以及两个关系。

与学生的关系可以是多对多的,除非可以预见startDate和endDate对每个学生总是不同的。一个出勤及其日期可以包含许多学生。一个学生可以有几个出勤职责。

Student <<---->> Attendance

显然,与 Lesson 的关系应该是一对多的。一个课程可以具有不同的考勤配置,具有不同的日期。但每个出勤仅属于一个课程

Lesson <---->> Attendance

要解决您的问题,您可以将课程考勤属性设为非可选(反之亦然),这样就可以确保每个课程至少有一个具有适当日期的出勤,每个出勤只有一个课程

我认为您可以删除学生课程之间的链接。只需指定出勤而不是课程。如果您希望将课程分配给没有日期的学生,只需允许出勤NULL作为这些属性。

答案 1 :(得分:1)

TheTiger,

仅仅因为Core Data会为您创建一个连接表,这并不意味着您必须使用它。保持哪个学生成功与哪个课程相同,除了你将创建中间实体,然后使用适当的设置者来建立关系。

您必须使用更多关键路径并进行关系预取,但这些操作很简单。

安德鲁