IOS开发学习笔记(二十一)——Core Data使用(下篇)

42、iOS开发中Core Data的使用指南 本博客详细介绍了在iOS开发中使用Core Data的完整流程,包括Core Data栈的搭建、实体描述的添加、托管对象的创建、数据的增删改查操作以及实体关系的建立。通过代码示例和流程图,帮助开发者全面掌握Core Data的基础使用和关键组件的作用,为高效管理iOS应用中的数据提供指导。 阅读详情

本篇主要讲述一些细枝末节的知识点。


建模

属性和关系

在XCode中,建模时就可以添加属性和标识实体间的相互关系。具体参见下图,下面还有对应说明:



  1. Entities中列举了实体的列表;
  2. 每个Entity的属性列表在Attributes中,注意Attributes可以多选之后在右边一起改属性类型;
  3. 通过添加关系可以标识出两种不同类型的Entity之间的相互联系;
  4. 每个Relationship都是可以编辑的,主要侧重于一对一还是多对一的关系描述;在我们这个例子中,我们在Employer中设置一对一的关系,然后在Company中选择"To-Many Relationship"选项,使得Company与Employer变成一对多的关系;
  5. 编辑完相互关系后,在Inverse中设置一下,使两者的关系变成真正的关联关系,而不是孤立的联系(这个可以选择Editor Style为table看到两者区别),到这里是不是和Hibernate有点类似了微笑;

创建NSManagedObject类的子类

好处——类型校验

创建NSManagedObject类的子类的对象的好处是你可以不用如下的代码(很明显如下的代码是没有类型校验的):

    NSManagedObject *event = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext];
    [event setValue:[NSDate date] forKey:@"creationDate"];

步骤

  1. 选中.xcdatamodeld这个模型文件;
  2. 选中一个实体;
  3. 从菜单中选择Editor->Create NSManagedObject class,可以创建需要的子类;




取回数据

注意fetch data的时候实际上可以直接使用code snippet,如下:



使用断言

使用断言可以用来筛选我们取出的数据,所以我们的代码可能是这样,同样可以使用code snippet:

-(void)loadData
{
    // Create the Request
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    // Set the Sort Descriptor
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];
    // Create Predicate
    // equal
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description == 'Tom's birthday'"];
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description == [c]'tom's birthday'"];
    // like
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description LIKE 'Tom*'"];
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description LIKE [cd]'Tom*'"];
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description LIKE '*om*'"];
    // begins
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description BEGINSWITH 'TOM'"];
    // date
//    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createDate < %@", [NSDate date]];
    // and
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"description BEGINSWITH 'TOM' AND createDate < %@", [NSDate date]];
    [request setPredicate:predicate];
    
    // Execute the Request
    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        // Handle the error.
        NSLog(@"error loading data");
    }
    // Finish Up
    [self setEventsArray:mutableFetchResults];
}

创建带断言的fetching request templete

创建模板的好处是XCode本身提供了一个编辑器,这样就不需要我们自己编写这部分断言代码,而是可以使用图形化的方式编辑我们的条件,而且便于我们管理这部分代码。

  1. 我们选择模型文件,然后去菜单,选择Editor->Add Fetch Request:


  2. 进入之后的页面中我们可以编辑我们的条件,并且可以切换图形和代码方式查看:


  3. 编辑完条件后,我们的代码变更为:
        
        // Create Fetch Request
        NSFetchRequest *fetchRequest = [[self managedObjectModel] fetchRequestTemplateForName:@"EssentialCourses"];
        
        // Create Sort Descriptor
        NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"releaseDate" ascending:YES];
        NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sort, nil];
        [fetchRequest setSortDescriptors:sortDescriptors];
        
        NSError *error = nil;
        NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
        if (fetchedObjects == nil) {
            NSLog(@"Problem! %@",error);
        }
        
        for (Course *c in fetchedObjects) {
            NSLog(@"Course: %@ by author: %@", c.title, c.author);
        }
    

  4. 运行,查看效果。


版本管理

数据不能兼容

对于数据不能兼容的情况,我们在AppDelegate中做如下处理:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataCourse.sqlite"];
    
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // delete record
        [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    
    
    return _persistentStoreCoordinator;
}

注意其中的removeItemAtURL。


向前兼容

为了数据能够向前兼容老版本,你需要做如下工作:

  1. 创建实体的新版本;

  2. 新实体创建后会出现如下图的对应model文件:


  3. 去编辑新的实体;

  4. 选中.cxdatemodelId,在右边的属性中选择激活的模型版本;

  5. 修改代码,注意新增加的options:
    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
    {
        if (_persistentStoreCoordinator != nil) {
            return _persistentStoreCoordinator;
        }
        
        NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataCourse.sqlite"];
        
        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption, nil];
    
        
        NSError *error = nil;
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }    
        
        return _persistentStoreCoordinator;
    }

  6. 这里还是描述的简单情况,实际的版本管理和数据合并更加复杂,您可能需要参考:https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html


尾声

到这里基本上Core Data相关的功能已经介绍完了,整体上看下来Core Data的学习曲线还是蛮陡峭的,但是基本的使用非常简单,建议大家在工作中逐步摸索。


下面是我学习的一个完整小例子供大家参考:下载地址。


Swift 4 Core Data实战教程:构建高效数据管理系统 本文还有配套的精品资源,点击获取 简介:本教程深入讲解了苹果开发平台中的Core Data技术,旨在帮助使用Swift 4的开发者全面理解并掌握数据管理框架的关键概念与技术。通过实例和实践指导,教程涵盖模型设计、上下文管理、托管对象操作、数据检索、持久化存储、生命周期管理、事务处理、性能优化和错误处理等核心内容。开发者将通过学习这些内容,构建应用,实现从基本数据存储到高级查... 阅读详情

相关推荐

使用Core Data构建iOS数据模型

本章详细介绍了如何使用Xcode的可视化数据编辑器创建Core Data项目,并指导读者如何通过编程将数据模型转化为代码,以及如何创建和保存托管对象。

weixin_31659095的博客 628

认识CoreData-基础使用

    第一篇文章中并没有讲CoreData的具体用法,只是对CoreData做了一个详细的介绍,算是一个开始和总结吧。 这篇文章中会主要讲CoreData的基础使用,以及在使用中需要注意的一些细节。因为文章中会插入代码和图片,内容可能会比较多,比较考验各位耐心。   文章中如有疏漏或错误,还请各位及时提出,谢谢!

weixin_34291004的博客 320

【万字长文】学习Armv8架构虚拟化一篇就够了

这里我们将介绍一些基础的Hypervisor和虚拟化的理论知识。如果你已经有一定的基础或是已经熟悉了这些概念,可以跳过这部分内容。我们用Hypervisor这个词来定义一种负责创建,管理以及调度虚拟机(Virtual Machines, VMs)的软件。Stage 2 转换允许Hypervisor控制虚拟机的内存视图。具体来说,其可以控制虚拟机是否可以访问特定的某一块物理内存,以及该内存块出现在虚拟机内存空间的位置。这种能力对于虚拟机的隔离和沙箱功能来说至关重要。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 5313

入坑 VSCode,编辑器设置及插件设置

从 WebStorm 养成的习惯,废弃了之前用 Eclipse 的时候,时不时地按一下 ⌘S 以消除保存忧虑的习惯。

程序员小麦的博客 3185

微信小程序marker 上的自定义气泡cover-view字体丢失以及max-width不生效问题

微信小程序marker 上的自定义气泡cover-view字体丢失以及max-width不生效问题

weixin_42028275的博客 1500

极智量化平台实战:5分钟教你用Python实现双均线交易策略(附完整代码)

本文详细介绍了如何在极智量化平台上使用Python实现双均线交易策略,包括数据获取、信号生成、回测分析和策略优化。通过完整的代码示例和实战演示,帮助开发者快速掌握量化交易系统的基本原理和应用方法,实现自动化交易。

weixin_29269441的博客 490

[Xcode 实际操作]七、文件与数据-(11)数据持久化存储框架CoreData的使用:创建CoreData实体并插入数据...

目录:[Swift]Xcode实际操作 本文将演示【CoreData】数据持久化存储框架的使用。 点击【Create a new Xcode project】创建一个新的项目 ->【Single View App】选择创建一个简单的单视图应用->【Next】 【Product Name】:CoreDataProject 勾选使用【CoreData】数据持久化存储框架的复选框,...

weixin_30367873的博客 398

结构优化软件:OptiStruct_(11).拓扑优化

在OptiStruct中,设计空间可以通过定义设计区域来实现。设计区域是结构中可以进行材料变化的部分。几何区域:通过几何选择工具选择特定的区域。网格区域:通过网格选择工具选择特定的单元。假设我们有一个简单的梁结构模型,网格文件为beam.fem。我们希望在梁的中部进行拓扑优化,以减轻重量并保持刚度。

kkchenjj的博客 1367

Core Data入门

一、简介   Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的。简单地用下图描述下它的作用: 左边是关系模...

weixin_34019929的博客 190

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

基于YOLOv8的违规抽烟/打电话检测系统:从数据集构建到部署实战

模型优点缺点精度高速度慢(5 FPS)SSD速度快小目标检测差YOLOv5平衡性好官方支持停止YOLOv8最新、最快、最准需要PyTorch环境YOLOv8相比前代:骨干网络升级(C2f模块)无锚框检测(Anchor-Free)动态任务对齐分配(TaskAlignedAssigner)支持分类/检测/分割/姿态估计。

YOLO 98

如何快速集成Encrypted Core Data:5步实现iOS Core Data数据库加密

Encrypted Core Data是一个基于SQLCipher的iOS Core Data加密SQLite存储解决方案,能帮助开发者轻松为应用数据添加安全保护。本文将通过5个简单步骤,教你如何在iOS项目中集成Encrypted Core Data,实现数据库加密功能。 ## 一、了解Encrypted Core Data的工作原理 在开始集成之前,我们先了解一下Encrypted Cor

gitblog_00211的博客 700

OpenCV-Python实战(3)——OpenCV中绘制图形与文本

OpenCV 是一个的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。本文介绍了 OpenCV 提供的与绘制图形和文本相关的函数。在图形方面,我们了解了如何绘制基本图形(直线、矩形和圆形等)以及高级图形(剪裁线、箭头、椭圆和多边形)。在文本方面,我们了解了如何绘制文本以及 OpenCV 库中的所有可用字体。

盼小辉丶的博客 2万+

Moody项目深度解析:如何在iOS应用中高效使用Core Data框架

Moody是一个功能完整的iOS应用示例项目,它完美展示了如何在现代iOS应用中高效使用Core Data框架。这个项目来自著名的objc.io Core Data书籍,是一个实际可运行的应用程序,允许用户通过拍照记录心情,并根据照片的颜色和地理位置进行智能分类。 ## 📱 什么是Moody项目? Moody是一个完整的iOS应用程序,它使用Core Data作为数据持久化框架,展示了Cor

gitblog_01063的博客 1018

FreeRTOS系统从入门到精通万字保姆级教程

例如,在基于ARM的硬件平台上,可能需要实现针对ARM处理器的上下文切换代码,并确保FreeRTOS能够正确地响应和处理ARM架构的中断。需要注意的是,在删除任务之前应确保任务已经完成了其所有重要的工作,并且没有其他的任务依赖于它,以避免数据丢失或系统不稳定。任务的优先级设定是其中的关键环节。在复杂的系统中,可能会有大量的任务需要同时运行,而这些任务的重要性和紧急程度各不相同。这通常包括创建初始任务(这些任务将负责系统的初始化和后续任务的调度)、设置系统时钟(以确保任务的准时调度和延时功能的正确性)等。

大模型大数据攻城狮的专栏 2070

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

iOS开发基础135-Core Data

合集 - iOS进阶(73)1.iOS开发基础77-一像素线的几种实现方式2016-03-262.iOS开发基础78-iOS 国际化2016-03-263.iOS开发基础82-关于iOS目录2017-04-194.iOS开发基础81-Runtime实战2017-04-175.iOS开发基础80-关于Xcode82016-11-156.iOS开发基础79-强制退出程序2016-10-207.iOS开...

weixin_37028219的博客 914

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

完整教程:使用Encrypted Core Data保护iOS应用敏感数据的7个最佳实践

Encrypted Core Data是一个基于SQLCipher的iOS Core Data加密SQLite存储解决方案,专为保护应用敏感数据而设计。本教程将分享7个实用最佳实践,帮助开发者轻松实现iOS应用数据的安全加密,有效防止数据泄露风险。 ## 一、了解Encrypted Core Data的核心架构 Encrypted Core Data通过在标准Core Data架构中添加加密层

gitblog_01025的博客 913

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Swift 与 Core Data:实现 iOS 应用的数据持久化

Core Data 是苹果提供的一个强大的数据管理框架,它并非传统意义上的数据库,而是一个 “对象图管理” 和 “持久化存储” 框架。Core Data 的核心作用是管理对象图,它能够将应用中的对象(通常是模型对象)与持久化存储(如 SQLite 数据库、XML 文件等)进行映射,实现数据的存储、读取、更新和删除操作。通过 Core Data,开发者无需编写复杂的 SQL 语句,即可轻松处理数据的持久化任务,大大提高了开发效率。

数字魔方操控师的博客 1089

iOS 开发 XMPP即时通讯项目开发(仿微信)-详解之Core data详解

cocoa认知 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。 CoreData本质是一个ORM框架 ORM Objective-Relational Mapping 这个映射就是我们的模型文件,一般ORM框架都用XML格式来映射 实体Entity+属性

高级软件开发工程师--周玉的博客 1851

兼容性指南:Encrypted Core Data在不同iOS版本和设备上的适配策略

Encrypted Core Data 是一个基于 SQLCipher 的 iOS Core Data 加密 SQLite 存储解决方案,版本 2.0 为开发者提供了在 iOS 应用中实现数据加密的强大工具。本指南将详细介绍如何在不同 iOS 版本和设备上有效适配 Encrypted Core Data,确保应用数据安全与功能稳定。 ## 核心架构与兼容性基础 Encrypted Core D

gitblog_00950的博客 678

iOS数据存储--Core Data

了解SQLite的使用,我们知道SQLite是一个关系型数据库,需要使用SQL语言来进行操作,而SQLite需要通过C调用对应的API,并进行一些底层的封装操作,而且Model对象文件需要自己编写,代码量会非常多。所以苹果在2005年第一次引入了Core Data框架,与SQLite相比,Core Data避免了SQL的复杂性,能让开发者更自然地与数据库进行交互。

学海无涯苦作舟 980

iOS Core Data 本地数据库 使用详解:从模型关系到数据操作

本文介绍了iOS开发中使用CoreData进行本地数据持久化的基本方法。首先通过创建.xcdatamodeld文件定义PHDramaEntity和PHEpisodeEntity两个实体及它们的一对多关系。然后使用NSPersistentContainer构建CoreData栈,并封装了CoreData管理类。文章重点演示了增删改查操作,包括创建实体对象、NSFetchRequest查询、属性更新和删除等核心功能,特别讲解了如何操作一对多关系。最后指出CoreData在NSPersistentContaine

weixin_39339407的博客 1704

iOS core Data 详解-<1>基本使用

Apple给我们提供了Core Data框架,它提供了对象-关系映射(ORM)功能,可以将OC对象转换为数据进行存储,也可以将保存在数据库中的数据还原成OC对象,可以直接按对象的方式操作数据,让这些变得非常简单。 core data是iOS应用中一种很好的持久性数据存储方式,从本质上来说,core data使用的SQLite, 所以效率也非常高,而且它可以很好的管理内存,它是对底层SQLite接口

jamy08的专栏 693

如何使用 Meteor iOS 实现 Core Data 与 Meteor 数据库的自动同步

Meteor iOS 是一个强大的框架,它能帮助 iOS 开发者轻松实现 Core Data 与 Meteor 数据库的自动同步,让移动应用的数据管理变得更加简单高效。通过 DDP(Data Distribution Protocol)协议,Meteor iOS 架起了原生 iOS 应用与 Meteor 平台之间的桥梁,实现了数据的实时双向同步。 ## 一、Meteor iOS 简介 Mete

gitblog_00340的博客 782

objc.io Core Data示例项目Moody:从零开始构建iOS数据驱动应用

**Moody**是objc.io Core Data书籍配套的完整示例项目,专为iOS开发者设计的**数据驱动应用开发模板**。通过这个项目,新手可以快速掌握Core Data框架的核心概念与最佳实践,从零开始构建具备数据持久化、模型管理和云同步功能的专业级iOS应用。 ## 📱 项目核心功能与架构概览 Moody项目展示了Core Data在实际应用中的典型用法,主要功能模块包括: -

gitblog_00932的博客 767
上一篇: IOS开发学习笔记(二十)——Core Data使用(中篇)
下一篇: IOS开发学习笔记(二十二)——ObjectC语言难以理解的概念汇总
Soloman
博客等级 码龄25年 171粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值