热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CoreData表关联详解

在企业中,通常会有多个部门,每个员工隶属于某个部门。这种情况下,员工表和部门表之间就会形成关联关系。本文将详细介绍如何在CoreData中实现表关联,并通过示例代码展示如何添加和查询关联数据。
表关联概述

在企业中,通常会有多个部门,每个员工隶属于某个部门。这种情况下,员工表和部门表之间就会形成关联关系。例如,在上一篇文章中我们已经创建了一张“Person”表,现在我们将创建一个“Country”表来演示表关联。

在这里插入图片描述 添加关联

首先,我们需要在CoreData模型中添加关联关系。假设我们已经有一个“Person”类,现在需要添加一个“Country”类,并建立两者之间的关联关系。

在这里插入图片描述

接下来,删除原有的“Person”类文件,重新生成新的“Person”类文件。重新生成后,你会发现“Person”类中多了一个关联属性。

在这里插入图片描述 添加关联数据

- (void)addPersonAndCountry {
    Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.context];
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Country"];
    NSPredicate *predicate = nil;
    if (arc4random() % 2) {
        predicate = [NSPredicate predicateWithFormat:@"name=%@", @"NaiCha"];
    } else {
        predicate = [NSPredicate predicateWithFormat:@"name=%@", @"KeKoCola"];
    }
    request.predicate = predicate;
    NSError *error = nil;
    NSArray *resultArray = [self.context executeFetchRequest:request error:&error];
    if (error) {
        NSLog(@"查询失败,错误信息:%@", error);
    } else {
        if (resultArray.count == 1) {
            Country *country = resultArray[0];
            int numberID = arc4random() % 10000;
            person.name = [NSString stringWithFormat:@"personSomeone%d", numberID];
            int64_t persOnAge= arc4random() % 100;
            person.age = personAge;
            person.country = country;
            [self.context save:&error];
            if (error) {
                NSLog(@"添加个人信息出错,错误:%@", error);
            } else {
                NSLog(@"添加个人信息:%@-%lld-%@", person.name, person.age, person.country.name);
            }
        } else {
            NSLog(@"查询无此国籍,无法添加个人信息");
        }
    }
}

运行结果:


2022-03-04 21:19:48.855904+0800 CoreData实践1[77919:3270501] 添加个人信息:personSomeone6740-84-KeKoCola

通过上述代码,我们可以看到,不需要编写任何复杂的数据库操作代码,直接将关联的对象作为属性成员赋值即可完成关联,非常方便。

查找关联数据

- (void)findSomebodyByCountry:(NSString *)countryName {
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"country.name=%@", countryName];
    request.predicate = predicate;
    NSError *error = nil;
    NSArray *resultArray = [self.context executeFetchRequest:request error:&error];
    if (error) {
        NSLog(@"查询失败,错误信息:%@", error);
    } else {
        NSLog(@"查询国籍为:%@的结果如下", countryName);
        for (Person *person in resultArray) {
            NSLog(@"name:%@ age:%lld country:%@", person.name, person.age, person.country.name);
        }
    }
}

运行结果:


2022-03-04 23:17:51.282876+0800 CoreData实践1[78883:3309210] 查询国籍为:NaiCha的结果如下
2022-03-04 23:17:51.283777+0800 CoreData实践1[78883:3309210] name:personSomeone8102 age:43 country:NaiCha
2022-03-04 23:17:51.283962+0800 CoreData实践1[78883:3309210] name:personSomeone5777 age:17 country:NaiCha
2022-03-04 23:17:51.284096+0800 CoreData实践1[78883:3309210] name:personSomeone966 age:17 country:NaiCha
2022-03-04 23:17:51.284221+0800 CoreData实践1[78883:3309210] name:personSomeone7477 age:57 country:NaiCha
2022-03-04 23:17:51.284329+0800 CoreData实践1[78883:3309210] name:personSomeone701 age:12 country:NaiCha
2022-03-04 23:17:51.284435+0800 CoreData实践1[78883:3309210] name:personSomeone2071 age:47 country:NaiCha
2022-03-04 23:17:51.284553+0800 CoreData实践1[78883:3309210] name:personSomeone1474 age:78 country:NaiCha

通过点语法增加约束条件,即可轻松实现关联数据的查询。


推荐阅读
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • MySQL Administrator: 监控与管理工具
    本文介绍了 MySQL Administrator 的主要功能,包括图形化监控 MySQL 服务器的实时状态、连接健康度、内存健康度以及如何创建自定义的健康图表。此外,还详细解释了状态变量和系统变量的管理。 ... [详细]
  • 本文通过一个简单的示例,展示如何使用ASP技术生成HTML文件。示例包括两个页面:首页index.htm和处理页面send.asp。 ... [详细]
  • C# 实现高效分页控件
    在使用 C# 进行数据库开发时,分页功能是常见的需求。为了避免每次编写重复的分页代码,我开发了一个用户控件,使分页操作变得更加简便。 ... [详细]
  • 2019-2020学年 20174325 叶竞蔚 《网络对抗技术》实验六:Metasploit基础应用
    本实验旨在掌握Metasploit框架的基本应用方法,重点学习三种常见的攻击方式及其实施思路。实验内容包括一次主动攻击(如MS08-067)、一次针对浏览器的攻击(如MS11-050)以及一次针对客户端的攻击(如Adobe漏洞利用)。此外,还包括成功应用一个辅助模块。 ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • MySQL 5.7 服务端在 Windows 上的安装与配置
    本文详细介绍了在 Windows 系统上安装和配置 MySQL 5.7 服务端的方法,包括 my.ini 配置文件的设置、初始化数据库、启动服务以及设置用户权限等步骤。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
author-avatar
0Hey0ne
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有