预期的结果是我想要每个学生的科目副本
例如,然后我可以为每个学生添加每个科目的成绩。
我不是在解决问题开头所述的问题,而是按照上面引用的最后所述的问题。
我鼓励您重新考虑模型的结构。
也许是这样的?
在这个建议的模型中,您可以分配给实体的对象Enrolment
:
- a
grade
(and date
) 通过这些属性属性;
- 学生通过一对多关系属性与
Student
实体;
- 一个主题通过一对多关系属性与
Subject
entity.
在以下示例中,我假设生成了核心数据NSManagedObject
子类 - 即 - 在数据模型检查器中,设置 Codegen = 类定义(默认)的值。
(就我个人而言,我更喜欢手动编写NSManagedObject
我的每个实体的子类并使用Set
而不是NSSet
,因为我随后发现在代码中维护类型完整性要容易得多。但我在这里没有这样做,因为大多数刚接触 Core Data 的人都会使用上面提到的 Codegen 的默认值。)
您可以通过以下方式访问这些值...
let student = Student()
print("Student name is: \(String(describing: student.name))")
if let studentEnrolments: NSSet = student.studentEnrolments {
for item in studentEnrolments {
if
let enrolment = item as? Enrolment,
let subjectName: String = enrolment.subject?.name {
print("Subject name for this student is: \(subjectName)")
}
}
}
为学生分配科目注册很容易......
let enrolment = Enrolment()
let subject = Subject()
enrolment.subject = subject
student.addToStudentEnrolments(enrolment)
然后现在或以后,成绩可以应用于注册的科目......
let grade: String = "A"
enrolment.grade = grade
当然,平均值变成了一个数学函数,基于每个学生所有成绩的总和除以计数。在我看来,这是根据需要更好地构造的,而不是保存为每个属性的属性Student
object.
Update
我正在更新我的答案,以包含一些数据库理论来解释我提出的对象模型。
根据维基百科,数据库规范化 https://en.wikipedia.org/wiki/Database_normalization is...
构建关系数据库的过程
按照一系列所谓的范式
减少数据冗余并提高数据完整性。
这对我来说实际上意味着什么?这意味着将我的数据分解为最离散和最独特的部分,因此,从理论上讲,我永远不需要多次输入任何独特的数据。
让我使用一个简单的表格示例来解释这一点,因为它可能会在电子表格(或您的模型概念)中列出:
原始数据
TABLE 1
A B C
1 STUDENT SUBJECT GRADE
2 Student1 Mathematics 8.8
3 Student1 Physics 7.0
4 Student1 Biology 6.0
5 Student2 Mathematics 5.0
6 Student2 Physics 9.0
7 Student2 Biology 7.0
标准化数据
TABLE 1 TABLE 2 TABLE 3
A B C A B A B
1 STUDENT SUBJECT GRADE ID STUDENT ID SUBJECT
2 1 1 8.8 1 Student1 1 Mathematics
3 1 2 7.0 2 Student2 2 Physics
4 1 3 6.0 3 Biology
5 2 1 5.0
6 2 2 9.0
7 2 3 7.0
标准化数据使用关系三张桌子之间。它存储了ID
(作为主键)每个STUDENT
和每个SUBJECT
,而不是实际的单词。这显然在许多不同方面都更加高效,包括但不限于:存储数据的字节数、索引能力、数据检索速度。
当您设置一个关系属性在你的核心数据对象模型图中,你正在做同样的事情......
因此,对于您的示例,核心数据对象模型图Entity取代表。 Core Data 框架在构造表时会自动将主键列插入到 SQLite 数据库中,然后在我们以编程方式添加行(记录,又名实体的实例)时会插入主键唯一整数。虽然我们作为开发人员无法直接访问它(使用 Core Data),但 Core Data 框架允许我们构建一对一、一对多和多对多关系两个实体之间,实现相同的结果。
Enrolment Student Subject
A B C A B A B
Rel. Rel. Att. Rel. Att. Rel. Att.
∞ ∞ 1 1
Z_PK Student Subject grade Z_PK name Z_PK name
1 1 1 8.8 1 Student1 1 Mathematics
2 1 2 7.0 2 Student2 2 Physics
3 1 3 6.0 3 Biology
4 2 1 5.0
5 2 2 9.0
6 2 3 7.0
Att.
= 实体属性;
Rel.
= 实体关系;
∞
= 一对多的多方关系(
1
= 一对多的一侧关系(-->)
有任何疑问请告诉我吗?