我目前正在为一个iPhone项目使用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
。)
很抱歉这是我第一次玩核心数据。
在sql背景上来自完整的时候需要习惯。
答案 0 :(得分:2)
你是对的。正确的方法是创建新实体,例如 StudentLessons 。我们称之为出席。它应该有startDate
和endDate
以及两个关系。
与学生的关系可以是多对多的,除非可以预见startDate和endDate对每个学生总是不同的。一个出勤及其日期可以包含许多学生。一个学生可以有几个出勤职责。
Student <<---->> Attendance
显然,与 Lesson 的关系应该是一对多的。一个课程可以具有不同的考勤配置,具有不同的日期。但每个出勤仅属于一个课程。
Lesson <---->> Attendance
要解决您的问题,您可以将课程的考勤属性设为非可选(反之亦然),这样就可以确保每个课程至少有一个具有适当日期的出勤,每个出勤只有一个课程。
我认为您可以删除学生和课程之间的链接。只需指定出勤而不是课程。如果您希望将课程分配给没有日期的学生,只需允许出勤将NULL
作为这些属性。
答案 1 :(得分:1)
TheTiger,
仅仅因为Core Data会为您创建一个连接表,这并不意味着您必须使用它。保持哪个学生成功与哪个课程相同,除了你将创建中间实体,然后使用适当的设置者来建立关系。
您必须使用更多关键路径并进行关系预取,但这些操作很简单。
安德鲁