在多对多关系上添加元素

2024-02-10

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

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

模型概念 https://i.stack.imgur.com/B6Ihu.png

Model: !https://i.stack.imgur.com/JipWz.jpg https://i.stack.imgur.com/JipWz.jpg

我创建了一组主题,因为它在多个位置使用:

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我创建了一个 NSSET 名为subjectsManagerSet从单例中获取值,但它不起作用。到目前为止我已经尝试过:

subjectManagerSet.addingObjects(from: subjectsManager.subjects)

还尝试创建一个 for 循环subjectManager.subjects添加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

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


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

我不是在解决问题开头所述的问题,而是按照上面引用的最后所述的问题。

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

也许是这样的?

在这个建议的模型中,您可以分配给实体的对象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= 一对多的一侧关系(-->)


有任何疑问请告诉我吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在多对多关系上添加元素 的相关文章

  • iOS11视觉框架映射所有人脸特征点

    我正在使用视觉框架并使用以下代码获取所有里程碑点 if let allFaceLandmarks landmarks allPoints print allFaceLandmarks 但无法找到这些点的映射 例如右眼的索引号 寻找相同的东西
  • 重置 ARKit 坐标

    我有一个简单的问题 如果我想开始游戏并将棋盘放在我面前 gameBoard position SCNVector3 0 0 0 6 这一直有效 直到我离开游戏并再次回来为止 我可以在镜头前将游戏板展示在完全相同的位置吗 0 6m在我前面 我
  • Swift:在标签背景中制作图像

    我想将标签放入带有角半径的红色矩形的图像中 条件是图像大小必须等于或略大于标签大小 为此我找到了一个类似的question https stackoverflow com questions 3037902 adding backgroun
  • iCloud 超时。 (使用iCloud + Core Data + Magical Record

    我开始了一个应用程序测试来使用Core Data and iCloud 使用魔法记录 经历了一番配置之后Provisioning Profiles和权利 应用程序终于运行了 一段时间后 应用程序崩溃并抛出此消息 2012 12 31 03
  • 如何禁用 ARCoachingOverlayView 的自动激活?

    我正在添加一个ARCoachingOverlayView to my ARView像这样 let coachingOverlayTemp ARCoachingOverlayView coachingOverlayTemp delegate
  • 如何以编程方式创建 Unwind segue

    我制作了一个不使用故事板的应用程序 在我的应用程序的这一部分中 我需要创建一个展开转场ThirdViewController to FirstViewController仅以编程方式 我知道如何使用 sotorybard 执行此操作 但找不
  • 扩展功能截图未捕获 iPhone 和 iPad 中的同一区域

    我正在使用扩展函数来截取 uiview 的屏幕截图 问题是结果看起来非常不同 我希望无论使用 ipad 还是 iphone 照片看起来都一样 我手动输入约束 因此我希望图像是相同的 我想使用该函数转到视图控制器的原点或中心 高度为 200
  • 使用 NSXMLParser 在 Swift 中解析分层 XML

    我确实在以我实际可以使用的形式获取分层 XML 值时遇到问题 因此我们将不胜感激 我对 Swift 和 IOS 开发还很陌生 所以说实话我并不完全理解解析器 但我希望在这之后我能理解 下面是我尝试解析的示例 XML 它来自肥皂网络服务 连接
  • 如何在 flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架

    In a 颤振插件 我想用一个Objective C我的框架iOS部分用swift编写 然后将其用于使用 Swift 的 Flutter 项目作为 iOS 语言 经过一些研究 我不是 iOS 开发人员 后 我发现我想要做的事情可以通过导入文
  • 检测 SFSafariViewController 中的 URL 更改

    我有一个 SFSafariViewController 当用户点击我的应用程序中的链接时 它会打开 我需要检测 URL 何时更改 这样当它更改时 应用程序会显示警报 我们如何检测 SFSafariViewController 中的 URL
  • 搜索结果中的 Swift 搜索结果控制器连接到另一个视图控制器

    Problem 我有一个表格视图 用户可以滚动查找某些内容或使用搜索栏 搜索栏不是使用 StoryBoard 创建的 我的观点有一个UISearchController处理搜索栏和搜索结果更新 我遇到的问题是 自从我SearchResult
  • 使用 Swift 创建 SKSpriteNode 子类

    我正在尝试创建作为 SKSpriteNode 子类的类 并且我想向其添加其他属性和函数 但在第一步中我遇到了错误 这是我的代码 import SpriteKit class Ball SKSpriteNode init super init
  • 获取 iOS Swift 中 UIViewController 的所有列表

    有没有办法获取 iOS Swift 项目中的所有 UIViewController 我想获取所有 UIViewController 的数组并检查特定的 UIViewController 是否存在 我必须找到项目中是否存在特定的 UIView
  • 如何以编程方式设置 UICollectionViewCell 宽度和高度

    我正在尝试实施一个CollectionView 当我使用自动布局时 我的单元格不会改变大小 但会改变它们的对齐方式 现在我宁愿将它们的尺寸更改为例如 var size CGSize width self view frame width 1
  • NumberFormatter 分组未按预期工作

    在进行货币格式化工作时 我在尝试格式化智利比索时发现了一个问题 按照此代码 let priceFormatter NumberFormatter priceFormatter locale Locale identifier es CL p
  • 如何在一个视图控制器中使用两个自定义 UITableViewCell 创建两个表视图?

    我正在尝试创建两个UITableViews在一个视图控制器中使用两个自定义UITableViewCells 我有以下内容 func tableView tableView UITableView cellForRowAtIndexPath
  • 在 iMessage 应用程序中检查横向/纵向方向(扩展)

    见过很多检查方向的解决方案 但奇怪的是 没有一个有效 下面是代码片段 override func viewWillTransition to size CGSize with coordinator UIViewControllerTran
  • 终止应用程序后发送本地通知 swift 2

    当应用程序状态进入终止 不运行状态时 可以在特定时间后执行某些特定任务 func applicationDidEnterBackground application UIApplication print APP in background
  • 何时以及为何使用多个 NSManagedObjectContext?

    基本上 我在我的应用程序中只使用了一个 moc 但我认为在某些情况下我应该使用多个 NSManagedObjectContext 什么时候应该使用多个 NSManagedObjectContext 我听说在某些情况下我应该使用 3 moc
  • 如何显示启动图像

    我是 iOS 新手 我的 Xcode 版本是 7 2 1 我尝试使用 Swift 在 iOS9 上运行 我的问题是我对如何创建启动屏幕图像感到非常困惑 我发现有很多方法可以为不同版本的 iOS 创建启动屏幕图像 有人可以向我解释一下如何设置

随机推荐

  • 8 位、16 位、32 位处理器/微控制器中整数的大小是多少?

    8 位 16 位 32 位处理器 微控制器中整数的大小是多少 我想这取决于内部累加器 寄存器的大小 但不确定 谢谢 我只知道一种编程语言定义了integer数据类型 但很少用于 8 位和 16 位体系结构 C 是最广泛使用的 8 位 16
  • PHP 全局命名空间函数

    在 PHP 中 我可以使用以下命令从另一个命名空间访问全局命名空间中的函数myFunc 代替 myFunc PHP 将自动回退到全局命名空间 如果myFunc无法在当前命名空间中解析 推荐的方式是哪种 myFunc or myFunc 如果
  • Scala 中通用过滤器函数中的错误

    我正在 Scala 中编写一个过滤器函数 虽然我对自己正在尝试做的事情感觉很好 但我无法弄清楚为什么它不会识别我的列表或这个错误告诉我什么 我尝试过编辑语法 但似乎没有任何办法可以解决它 sealed trait List A case o
  • 在支持超线程的四核 CPU 上运行的单 CPU 程序

    我是统计模式识别领域的研究员 我经常进行持续很多天的模拟 我正在运行 Ubuntu 12 04 和 Linux 3 2 0 24 generic 据我所知 它支持多核和超线程 使用带有 HTT 的 Intel Core i7 Sandy B
  • azure 中何时创建了块 blob?

    blob 引用包含一个Properties财产有一个LastModified of DateTimeOffset 但是 我找不到 blob 的创建日期 时间 是否有我可以使用的标准 API 或者我需要将其存储在元数据中 public asy
  • 我可以使用Boost消息队列进行线程通信吗

    我正在从主线程生成多个工作线程 我可以从主线程为每个线程创建 message queue 并从主线程发送消息吗 我问这个是因为消息队列是用于进程间通信的吗 我需要考虑与此相关的任何具体事项吗 正如所提到的Boost Message Queu
  • 当分母中的元素可能为零时,有效的逐元素矩阵除法

    我正在使用 numpy 使用 Python 2 7 6 进行编程 我在两个 numpy 矩阵之间进行了划分V np dot W H 有时 分母的某些单元格值等于 0 因此我会收到运行时错误 我想以有效的方式实施安全划分 我如何编写执行矩阵除
  • 为左浮动 div 或列表设置文本溢出省略号

    这是我想做的 创建一个仅占用所需空间 水平 的列表 即最长的列表元素 当列表不适合页面时 修剪列表文本并显示省略号 我使用的组合white space nowrap and text overflow ellipsis 对于普通列表来说它工
  • 在ios中使用AVAudioSession时出错

    我用了这些代码 void viewDidLoad AVAudioSession sharedInstance setDelegate self AVAudioSession sharedInstance setCategory AVAudi
  • 如何以八度增加命令窗口的字体大小

    我试图弄清楚如何增加命令窗口文本 我想通了legend legend fontsize 10 Low fontsize 10 Medium fontsize 10 High 我尝试做同样的事情 但是command command windo
  • 谷歌地图无法正确呈现

    我正在使用主干和 gmaps js 由于某种原因 地图无法正确渲染 控制器没有正确显示 信息窗口的渲染也很奇怪 我正在使用gmaps js 库 https github com HPNeo gmaps 我什至不知道如何调试这个东西 这是我的
  • 计数信号量和二进制信号量之间的区别

    计数和二进制信号量有什么区别 我在某处看到的是 两者都可以控制 N 个请求资源的进程 两者都拥有自由邦 二进制信号量和计数信号量可以保护的资源数量是否有限制 两者都只允许一个进程一次使用一种资源 还有其他区别吗 上述属性是否正确 实际上 这
  • python语法错误无效语法[重复]

    这个问题在这里已经有答案了 我是 Python 编程语言的新手 我买了一本书并且一直在读 这本书的名字是 3x Python 初学者编程第三版 我正在努力将迄今为止所学到的知识付诸实践 我有一个我不明白的问题 我知道它很简单 但我不确定如何
  • 如何在 SQLAlchemy for MSSQL 中设置架构?

    我目前这样做 usr bin env python 3rd party modules from sqlalchemy import create engine requires pymssql local modules from con
  • 如何尽可能快地将大量记录插入MySql数据库

    我有一个如下所示的数据库表 create table temperature id int unsigned not null auto increment primary key temperature double 在我的程序中 我将大
  • 从 Xamarin.Forms 应用程序打印

    我是 Xamarin 新手 目前正在使用 Xamarin Forms 开发示例或 概念证明 应用程序 我应该从这个应用程序执行打印任务 尽管我现在还不确定要打印什么 屏幕 标签内容 文件等 无论哪种方式 从 Xamarin Forms 应用
  • 使用来自互联网的图像更新 Android 小部件(使用异步任务)

    我有一个简单的 Android 小部件 我想用互联网上的图像进行更新 我可以在小部件上显示静态图像 没有问题 有人告诉我 您需要为此使用异步任务 而我对此没有太多经验 这是我的小部件 Override public void onUpdat
  • Docker Rancher - 从 WSL 使用 docker 时权限被拒绝

    我已经在 Windows 10 上使用 dockerd 选项安装了 Docker Rancher 并为我当前的 WSL 发行版 Ubuntu 安装了 WSL 当我尝试在 WSL2 中使用 docker 时 出现以下错误 fpapi xxx
  • Java 中 int 转换为数组 char

    我试图在不使用字符串操作的情况下将整数转换为字符数组 我的尝试是 int number 12 char test Character toChars number for char c test System out println c 没
  • 在多对多关系上添加元素

    我正在做一个项目 从学校的角度 你可以计算每个学生的平均值 您可以在一个屏幕上注册学生 第一个实体 在另一个屏幕上注册科目 第二个实体 学生有姓名 电子邮件 成绩和平均分作为属性 科目有姓名 它们彼此之间是多对多关联的 我正在尝试为每个学生