为核心数据手动创建多对多关系中的中间表

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

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

例如,在标准 sql 模型中,我的连接表将类似于

StudentLessons (Studentid, LessonId, StartDate, LeaveDate )

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

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

我看到有人说您实际上会在核心数据中手动创建StudentLesson 实体。

现在,如果我这样做,我是否只拥有属性(Startdate、LeaveDate)以及来自 Student 和 Lessons 表的一对多关系?

Student - > StudentLessons
Lesson - > StudentLessons

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

抱歉,这是我第一次玩 Core Data。

从一个完整的 sql 后台开始需要一点时间来适应。

【问题讨论】:

【参考方案1】:

你完全正确。正确的做法是创建一个新实体,如StudentLessons。我们称之为出勤率。它应该有startDateendDate,以及两个关系。

与学生的关系可以是多对多的,除非可以预见每个学生的 startDate 和 endDate 总是不同的。一个带有日期的出席可以有很多学生。一名学生可以有多个出勤职责。

Student <<---->> Attendance

显然,与 Lesson 的关系应该是一对多的。一堂可以有不同的出勤配置,有不同的日期。但是每个出席只属于一个

Lesson <---->> Attendance

为了解决您的问题,您可以将 LessonAttendance 属性设为非可选(反之亦然),这样可以确保每个 Lesson 至少有一个 Attendance 和适当的日期,并且每个 Attendance 恰好有一个 Lesson

我认为您可以删除 StudentLesson 之间的链接。只需分配一个出勤率而不是一堂课。如果您希望将 Lesson 分配给没有日期的 Student,只需允许 AttendanceNULL 作为这些属性。

【讨论】:

【参考方案2】:

老虎,

Core Data 会为您创建一个连接表,但这并不意味着您必须使用它。除了您将创建中间实体然后使用适当的设置器来建立关系之外,保持哪个学生在哪个课程上成功是一样的。

您将不得不使用更多的关键路径并进行关系预取,但这些都很简单。

安德鲁

【讨论】:

谢谢 Andrew - 这些技术的任何可用示例? (又是核心数据的新手......) Apple 的网站上有很多例子。 Core Data 将推动你对 Objective-C 的了解。因此,它可以有很大的学习曲线。我建议你读几本关于 Core Data 的书之一。 Apple 的教程和编程指南也值得一读。

以上是关于为核心数据手动创建多对多关系中的中间表的主要内容,如果未能解决你的问题,请参考以下文章

Python Django 多对多三种创建方式 form组件 cookie和session

NSPredicate 在核心数据中的多对多关系

Hibernate学习笔记 --- 创建基于中间关联表的多对多映射关系

十一 .Django 多对多表ManyToManyField (ORM)

Django:表多对多查询聚合分组FQ查询事务

孩子不会更新 Xamarin SQLite 扩展 - 多对多关系