gpt4 book ai didi

swift - 在多对多关系上添加元素

转载 作者:行者123 更新时间:2023-11-28 13:27:19 26 4
gpt4 key购买 nike

我正在做一个项目,您可以(从学校的角度)计算每个学生的平均值。您可以在一个屏幕上注册学生(第一个实体),在另一个屏幕上注册科目(第二个实体)。Student 有姓名、电子邮件、成绩和平均分作为属性,而 Subjects 有姓名。它们彼此之间存在多对多关系。

我正在尝试为每个学生创建一个科目列表副本,然后我可以为每个学生注册每个科目的成绩。像这样:

Model concept

型号:! https://imgur.com/gmXyR5j

我创建了一个单独的主题,因为它被用于多个位置:

import Foundation
import CoreData

class SubjectsManager {
static let shared = SubjectsManager()
var subjects: [Subject] = []

func loadSubject(with context: NSManagedObjectContext) {
let fetchRequest: NSFetchRequest<Subject> = Subject.fetchRequest()
let sortDescritor = NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [sortDescritor]

do {
subjects = try context.fetch(fetchRequest)
} catch {
print(error.localizedDescription)
}
}

func deleteSubject(index: Int, context: NSManagedObjectContext) {
let subject = subjects[index]
context.delete(subject)

do {
try context.save()
subjects.remove(at: index)
} catch {
print(error.localizedDescription)
}
}

private init() {

}
}

而且,在我的学生屏幕上,我尝试了很多方法,但没有任何效果。学生与主题的一对多关系称为 registeredSubjects我创建了一个名为 subjectsManagerSet 的 NSSET 来从单例中获取值,但它不起作用。这是我到目前为止尝试过的:

subjectManagerSet.addingObjects(from: subjectsManager.subjects)

还尝试创建一个 subjectManager.subjects 的 for 循环以添加到 subjectManagerSet 但它也不起作用。

关于错误,当我从 xcode 输出中获取样本时,它一直显示 subjectManagerSet 没有从 subjectManager.subject 中获取值

错误信息:

2019-09-26 20:38:16.983725-0300 MyAverage[1734:62290] Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file /Users/vitorgomes/Desktop/Mentorizacao/MyAverage/MyAverage/Controllers/StudentsViewController.swift, line 119
(lldb) po subjectManagerSet
0 elements

预期的结果是我想要每个学生实例的科目副本,然后我可以为每个学生的每个科目添加成绩。

最佳答案

The expected result is that i want a copy of subjects for each student instance, then i can add grades for each subjects for each student.

我不是在解决您问题开头所述的问题,而是根据上面的引述解决问题末尾所述的问题。

我鼓励您重新考虑模型的结构。

也许是这样的?

proposed Core Data object model graph

在此提议的模型中,您可以分配给实体 Enrolment 的对象:

  • 通过这些属性获得 grade(和 date);
  • 学生通过一对多关系属性与 Student 实体;
  • 通过一对多关系属性与 Subject 实体的主题。

在以下示例中,我假设 Core Data 生成了 NSManagedObject 子类 - 即 - 在数据模型检查器中,设置 Codegen = Class Definition(默认)的值。

(就个人而言,顺便说一句,我更喜欢为我的每个实体手动编写 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 对象的属性保存。

更新

我更新了我的答案以包含一些数据库理论来解释我提出的对象模型。

根据维基百科,Database normalisation是……

the process of structuring a relational database in accordance with a series of so-called normal forms in order to reduce data redundancy and improve data integrity.

这实际上对我意味着什么?这意味着将我的数据分解成最离散和最独特的部分,因此,从理论上讲,我永远不需要多次输入任何独特的数据。

让我使用一个简单的表格示例来解释这一点,因为它可能在电子表格(或您的模型概念)中列出:

原始数据

     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

标准化数据使用三个表之间的关系。它存储每个 STUDENT 和每个 SUBJECTID(作为主键),而不是实际的单词。这显然在许多不同方面更有效,包括但不限于:存储数据的字节数、索引能力、数据检索速度。

当您在 Core Data 对象模型图中设置一个关系属性时,您正在做同样的事情...

因此对于您的示例,Core Data 对象模型图 Entity 替换了 TABLE。 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 = 一对多关系 (-->)

的一侧

有任何问题,请告诉我?

关于swift - 在多对多关系上添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58126027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com