热门标签 | 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

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


推荐阅读
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
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社区 版权所有