CoreData 从入门到精通(三)关联表的创建

2023-05-16

CoreData 从入门到精通(三)关联表的创建

上篇博客中讲了 CoreData 里增删改查的使用,学到这里已经可以应对简单的数据存储需求了。但是当数据模型复杂起来时,例如你的模型类中除了要存储 CoreData 里支持的数据类型外,还有一些自定义的数据类型,这个时候只靠单一的模型结构就没办法来满足这种需求了,于是我们就需要使用关联表结构,也就是我们这次要讲的内容。

简介

多表关联,相信接触过 SQL 数据库的朋友都不陌生,就是指可以在一张表的数据中可以引用另外一张表里的数据。QQ 里的好友关系,微博里的用户和微博条目之间都用到了多表之间的关联。同样的,在 CoreData 里,也可以实现这样的功能,而且 CoreData 比起传统的 SQL 数据库来,更加简单。

创建关联表

CoreData 里的多表关联,是通过 Entity 实体中的 Relationships 来实现的:
Relationships-w600

上篇文章中,我们已经创建好了一个 Student 实体,现在我们需要再创建两个实体,分别是 和 Course 分别代表班级和课程。首先来创建出这两张表。
Clazz 班级表:
Clazz-w600

Course 课程表:
Course-w600

表创建好后,我们来为这三张表建立关联关系,它们之间的关系是这样的:Student 里有一个 studentClass 字段代表学生所属的班级,一个 studentCourses 字段代表学生在学的所有课程;

Clazz 里有一个 classStudents 字段代表班级里所有的学生;Course 里有一个 courseStudents 代表学习这门课程的所有学生。可以看出来,这几个字段都是彼此关联的关系。根据上面说的,我们需要用 relationships 来创建这些关联的字段。
首先来创建 Student 里的两个关系:
studentClass-w600

先看 studentClass 字段,在 1 中,Destination 属性指的是和这个 字段建立关联的实体的名字,这里可以选择 DataModel 中的其他实体,也可以是当前的这个实体(好友关系中,就是和当前实体本身建立关联),这里我们选择 Clazz 实体,另外我们还可以在右侧的 Data Model Inspector 面板中配置一些当前 relationship 的其他信息,2 中的 Inverse 指的是在 Clazz 实体中和 studentClass 字段反向关联的字段,根据上面的描述,这里应该指定 classStudents;3 中的 Type 可以选择关联关系的类型,有 To One 和 To Many 两种选择,分别代表对一关系和对多关系,显然一个学生只能在一个班级里,所以这里选择 To One。同样的,来创建 studentCourses 字段,创建好之后是这样的:
studentCourses-w600

接下来,再来创建另外两个实体中剩下的两个字段:

Clazz 实体里的 classStudents 字段:
classStudents-w600

Course 实体里的 courseStudents 字段:

courseStudents-w600

需要说明的是,这两个字段反向关联到 Student 实体对应的字段的类型都是一对多的,这里记得要正确设置。然后设置 Inverse 后,Student 实体里对应的 Inverse 属性也会自动设置:

Students-w600

DataModel 除了上面这种展示方式,还可以展示为关系图的形式,点击右下角的切换键就可以切换过去:
-w600

在这种模式下,各个实体之间的关系就一目了然了,单个箭头表示的是对一的关系,双箭头就表示对多的关系。从这里可以很方便地检查我们的表关系有没有设置正确。

删除规则

关联表创建好后,还差一个比较重要的属性没有介绍,就是 Relationship 的删除规则:
-w300

删除规则(Delete Rule)规定了这条数据删除时,它所关联的数据该执行什么样的操作。这里有四种规则可以选择:
* No Action
* Nullify
* Cascade
* Deny

下面通过一个例子来说明这四个类型都有什么效果:

假如我们删除一名学生,
如果把 Delete Rule 设置成 No Action,它表示不做任何,这个时候学生所在的班级(Class.classStudents)依然会以为这名学生还在这个班级里,同时课程记录里也会以为学习这门课程(Course.courseStudents)的所有学生们里,还有这位学生,当我们访问到这两个属性时,就会出现异常情况,所以不建议设置这个规则;
如果设置成 Nullify,对应的,班级信息里就会把这名学生除名,课程记录里也会把这名学生的记录删除掉;
如果设置成 Cascade,它表示级联操作,这个时候,会把这个学生关联的班级以及课程,一股脑的都删除掉,
如果 Clazz 和 Course 里还关联着其他的表,而且也设置成 Cascade 的话,就还会删除下去;如果设置成 Deny,只有在学生关联的班级和课程都为 nil的情况下,这个学生才能被删除,否则,程序就会抛出异常。
所以这里,我们把 Student 的 studentClass 和 studentCourses 的删除规则设置成 Nullify 是最合适的。
nullify-w600

实体类生成

在有关联关系的实体里,对一关系是通过对应实体类的属性来表示的,对多属性则是实体类的集合,我们可以看一下 Xcode 自动生成的实体类代码(自动生成的代码默认在 /Users/userName/Library/Developer/Xcode/DerivedData/ProjectName/Build/Intermediates/ProjectName.build/Debug-iphonesimulator/ProjectName.build/DerivedSources/CoreDataGenerated/ProjectName/):

-w600

另外对关联表进行增删改查时和单表的增删改查没太大区别,只需需要配置一下关联的属性即可。

Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:self.context];

Clazz *clazz = [[Clazz alloc] initWithContext:self.context];
// configure clazz
// ....

student.studentClass = clazz;

Course *english = [[Course alloc] initWithContext:self.context];
Course *math = [[Course alloc] initWithContext:self.context];   

[student addStudentCoursesObject:english];
[student addStudentCourses:[NSSet setWithObjects:english, math, nil]];

[self.context save:nil];

调用 save 后,student 和它关联的 clazz、math、english 都会保存到数据库中。

到这里,CoreData 里关联表的创建也就讲完了,下次准备在讲一下 CoreData 里的并发操作。

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

CoreData 从入门到精通(三)关联表的创建 的相关文章

  • CentOS8下编译配置nginx+rtmp,搭建推流服务器

    一 环境 服务器操作系统 xff1a CentOS Linux release 8 2 2004 Core nginx 版本 https nginx org download nginx 1 18 0 tar gz RMTP模块 xff1a
  • CentOS7网络配置(ping不同的原因及解决方法)

    这是配置好的CentOS7 xff0c 刚开始在Vmware里装CentOS7后是没有ip的 xff0c 原因是CentOS7默认不启动网卡的 xff0c 网卡不启用还ping个毛 进入 etc sysconfig network scip
  • SpringBoot-JPA进行多表连接查询

    通过JPA进行简单的 内 连接查询 1 准备 1 1开发工具Intellij Idea 1 2数据库mysql 1 3新建Spring Initializr项目 xff0c 勾选web mysql rest jpa依赖 2 开始 2 1项目
  • 响应式导航栏-利用纯css实现

    思路 xff1a 当屏幕为移动设备时 xff0c 隐藏导航栏列表项目 xff0c 显示菜单按钮 给菜单按钮 xff08 电脑时隐藏 xff09 加入hover 或者checked选择器实现 xff0c 当hover或者checked的触发时
  • BTRFS文件系统安装ArchLinux

    layout post title BTRFS文件系统安装ArchLinux date 2017 10 02 categories Linux 主要为以下步骤 xff1a 1 下载ArchLinux安装镜像并 制作U盘启动工具 2 开机进入
  • JSP文件上传

    JSP文件上传 网上的方法几乎都是使用的org apache commons fileupload的jar包 xff0c 需要手动下载导入commons fileupload jar和commons io jar 其实tomcat自带的or
  • ORPALIS PDF Reducer Pro(免费pdf压缩器工具)官方正式版V4.0.1 | pdf免费压缩软下载 | 怎样将pdf压缩得很小?

    ORPALIS PDF Reducer Pro 是一款优秀实用的离线单机版pdf免费压缩软件 xff0c 也就是大家说的免费pdf压缩器工具 xff0c 内置多种超高压缩比的PDF压缩算法和创新的页面布局分析以及自动颜色检测机制 xff0c
  • ubuntu系统文件夹作用

    opt 文件夹 用户级的程序目录 xff0c 可以理解为D Software xff0c opt有可选的意思 xff0c 这里可以用于放置第三方大型软件 xff08 或游戏 xff09 xff0c 当你不需要时 xff0c 直接rm rf掉
  • rhel7安装GUI

    check the rank of starting system systenmctl get default not found startx 查看光盘是否挂载 df 挂载 yum mount dev sr0 mnt mount dev
  • org-mode Properties-and-Columns翻译

    https orgmode org manual Properties and Columns html Properties and Columns 文章目录 属性属性语法特殊属性属性查询属性继承 Column View 列视图定义列列定
  • python利用ffmpeg进行rtmp推流直播

    思路 xff1a opencv读取视频 gt 将视频分割为帧 gt 将每一帧进行需求加工后 gt 将此帧写入pipe管道 gt 利用ffmpeg进行推流直播 pipe管道 xff1a 啥是pipe管道 xff1f 粗略的理解就是一个放共享文
  • 电脑环境PCL配置及VS2019环境配置

    VS2019配置pcl 1 12 0 前言 对于 3D 点云处理来说 xff0c PCL 完全是一个的模块化的现代 C 43 43 模板库 其基于以下第三方库 xff1a Boost Eigen FLANN VTK CUDA OpenNI
  • java算法--兔子繁殖问题

    java算法 兔子繁殖问题 题目 xff1a 古典问题 xff1a 有一对兔子 xff0c 从出生后第 3 个月起每个月都生一对兔子 xff0c 小兔子长到第四 个月后每个月又生一对兔子 xff0c 假如兔子都不死 xff0c 问每个月的兔
  • Linux配置Wifi模块

    linux终端无线网卡连接wifi xff1a 扫描可用连接wifi nmcli dev wifi 添加一个wifi的连接 nmcli dev wifi con 无线网络名称 password 无线网络密码 name 任意连接名称 xff0
  • Paho MQTT 嵌入式c客户端研究笔记

    最近做物联网设备 xff0c 需求长连接推送功能 当前物联网有一个标准协议是MQTT xff0c 对应有很多开源服务端 xff0c 如何快速接入这个服务呢 有两种接入方案 xff1a 1 自己clone 代码修改维护 2 找第三方服务 xf
  • Paho MQTT 嵌入式c客户端研究笔记 (二)

    paho mqtt embedded c master MQTTPacket samples xff0c 这个目录里面封装了发布消息 订阅消息的示例 运行pub0sub1 xff0c 这个示例里面会去订阅主题消息 发布主题消息 并且订阅和发
  • Android App 架构设计

    简介 本文是对谷歌原生文档的翻译 xff0c 仅供学习参照 原文链接 此文档写给希望学习最优编程实践和架构以开发健壮 高质量APP的开发者 开发者常遇到的问题 传统的桌面程序大多数使用场景是有一个启动入口 xff0c 作为一个独立进程运行
  • Linux Ubuntu 18.04 换源

    在安装好Ubuntu后 xff0c 你会发现软件下载安装速度非常慢 xff0c 甚至会出错 xff0c 因为Ubuntu官方的源在国内访问的速度非常慢 xff0c 但是我们可以更改系统的源为国内的一些源来提高速度 xff08 国内各大网站的
  • gradle学习二 利用javassist api修改class字节码

    一 前言 Javassist Java Programming Assistant makes Java bytecode manipulation simple It is a class library for editing byte
  • AirPlay Android接收端学习一 协议

    一 AirPlay 接收端描述 AirPlay是苹果的私有协议 xff0c 苹果官方未开放api和sdk xff0c 目前相对权威的一份非官方协议文档 这篇文档详细描述了aiplay 服务发现 图片 音视频 镜像投屏的相关协议 xff0c

随机推荐

  • android手机 加速度传感器 获取x,y,z轴上的加速度

    package com zhp andorid import android app Activity import android content Context import android hardware Sensor import
  • 声纹识别调研

    1 基础概念 声纹 Voiceprint xff0c 是用电声学仪器显示的携带言语信息的声波频谱 现代科学研究表明 xff0c 声纹不仅具有特定性 xff0c 而且有相对稳定性的特点 成年以后 xff0c 人的声音可保持长期相对稳定不变 实
  • Gradle学习三 :AS自定义Gradle插件

    一 定义插件 1 File New Module Android Library 取名plugin1 2 删除plugin1目录下所有文件 xff0c 只保留build gradle 编写build gradle 代码如下 xff1a ap
  • Android Hook 一 Hook CloseGuard

    一 抛出问题 在上一篇 dalvik system CloseGuard 介绍了CloseGuard的原理和作用 xff0c 并在文中提到 APP端可以利用Hook REPORTER 在来实现客制化的上报提示信息 本章通过代码来学一下怎样H
  • Python小白学习笔记-day3

    第三章 Python基本数据类型 学习笔记 浮点数与整数 xff0c Python浮点数运算存在 不确定尾数 问题 xff0c 即两个浮点数运算 xff0c 有一定概率在运算结果后增加一些 不确定的 尾数 xff08 受限于计算机表示浮点数
  • Java实现凯撒密码

    Java实现凯撒密码 加密和解密代码 根据公式 C 61 xff08 P 43 key mod 26 P 61 xff08 C 43 key 1 mod 26 key 1 61 26 key 26 可知 c 61 char c a 43 k
  • Pycharm使用pip报错:Script file ‘D:\Anaconda3\envs\pytorch\Scripts\pip-script.py‘ is not present

    问题描述 xff1a 报错情况1 xff1a 使用pip安装报错 xff1a Script file D Anaconda3 envs pytorch Scripts pip script py is not present 报错情况2 x
  • pip提示版本低需要升级,WARNING: You are using pip version 20.1.1; however,version 20.2.3 is available.

    警告 xff1a 您使用的是pip版本20 1 1 xff1b 但是 xff0c 版本20 2 3是可用的 You should consider upgrading via the 39 e python38 python exe m p
  • manjaro换源

    安装Linux系统必定先换源 xff01 xff01 xff01 x1f601 换源这一块 xff0c 我认为debian系 xff08 如Ubuntu xff09 以及Red Hat系 xff08 如fedora xff09 与基于Arc
  • WARNING: Ignoring invalid distribution -ip (d:\python3.7.5\lib\site-packages)

    警告原因 xff1a 之前安装插件失败 中途退出 xff0c 导致插件安装出现异常导致的 解决方法 xff1a 找到警告信息中报错的目录 xff0c 然后删掉 开头的文件夹
  • Linux上安装ntp

    问题 要同步6台服务器上的时间 xff0c 主要为了以后安装大数据软件做准备 xff0c 这里就需要安装ntp软件 解决 安装ntp和配置环境 1 gt 准备工作 xff1a 关闭防火墙 xff08 一定要关防火墙 xff0c 我是直接永久
  • ubuntu20.04上安装mysql

    目录 安装卸载 安装 命令安装 xff1a 更新源 sudo apt update 默认下载 xff0c 因为下载其他版本太复杂了 xff0c 这里默认是mysql8 0 29 sudo apt install mysql server y
  • arch安装和配置

    问题 安装arch 这里就不赘述相关的步骤 xff0c 我是看b站一个视频 xff0c 下面会给出网址 xff0c 但是要提示一下 xff0c 网络部分是错误的 xff0c 要更改一下 安装之后要配置相关的东西 xff0c 安装完成之后就是
  • (记录)电脑维修指南

    问题 自己在2020年的时候花了将近1500块自己组装了一台计算机 xff0c 但是经常出现蓝屏 xff0c 自动重启 xff0c 并且显示硬件问题 xff0c 2022年的时候也拆开过修过一次 xff0c 也和客服battle了几次 xf
  • 代码复现问题以及解决

    问题 cuda版本不匹配 xff0c 对于版本不匹配问题真的很难受CPU版本还有GPU版本问题包安装 xff0c apex加速的安装 xff0c transformer版本也会限制python的版本程序运行 xff0c 如果程序写的是比较好
  • one-hot向量形式

    one hot向量 one hot向量将类别变量转换为机器学习算法易于利用的一种形式的过程 xff0c 这个向量的表示为一项属性的特征向量 xff0c 也就是同一时间只有一个激活点 xff08 不为0 xff09 xff0c 这个向量只有一
  • c语言中的位移位操作

    先要了解一下C语言里所有的位运算都是指二进制数的位运算 即使输入的是十进制的数 xff0c 在内存中也是存储为二进制形式 lt lt 用法 xff1a 格式是 xff1a a lt lt m xff0c a和m必须是整型表达式 xff0c
  • iOS动画(Core Animation)

    一 CABaseAnimation 移动动画 void testPositionAnimation CGFloat tempViewWidth 61 50 CGFloat tempViewY 61 300 UIView tempView 6
  • 使用Linux命令生成随机密码

    使用SHA算法来加密日期 xff0c 并输出结果的前10个字符 xff1a span class token function date span 43 s span class token operator span sha256sum
  • CoreData 从入门到精通(三)关联表的创建

    CoreData 从入门到精通 xff08 三 xff09 关联表的创建 上篇博客中讲了 CoreData 里增删改查的使用 xff0c 学到这里已经可以应对简单的数据存储需求了 但是当数据模型复杂起来时 xff0c 例如你的模型类中除了要