Core Data的使用

article/2025/8/19 20:18:49

       初步看了一下Core Data这个东西,本想早一点写这篇东西的,不过各种俗事缠身,又觉得自己对于Core Data机制了解的还不够深,动笔就慢了几天。不过今天盘点一下,觉得可以说一点东西出来就先说一点吧。

      Core Data到底是个什么东西?是不是就是SQLite数据库?我觉得随着应用的越来越复杂,体现出来就是数据之间的关系越来越复杂,访问逻辑也变的更加的复杂臃肿,而相当多的应用都会用到数据的模型(或简单或复杂),所以苹果就单独弄了这样一个概念出现,并提供了辅助编辑/代码生成的工具,可以帮助减少不少工作量。至于说数据库,确实很多时候Core Data都是用数据库来做存储的支撑,但一来并非必须用数据库来存储,二来封装之后不需要任何SQL语句的,所以只能说数据库是支撑Core Data的技术之一,并非等价于Core Data。

      Core Data里面自己定义了一些名词,什么NSManagedObject/NSManagedObjectContext/NSManagedObjectModel,这几个是最混淆的,其他的什么NSFetchRequest/NSEntityDescription还算好一点。(顺便吐槽一句,这种术语的翻译是最成问题的,不少书中还把这些翻成托管对象,托管对象上下文等等的,第一次看的时候你肯定一头雾水)

       既然说到是Data,那么肯定是以数据为核心,同时封装对于数据的操作,形成一系列的辅助类。

       NSManagedObject肯定是核心,这个可以看成一个一个的数据对象的实例,但封装后你很少直接访问这个类

       NSManagedObjectContext是我们实际编程时打交道最多的,要访问一个数据对象,必须通过他的上下文

       NSManagedObjectModel是我们整个应用程序里面的数据的抽象,包括了Entity,Attribute,Request等等

       NSPresistentStoreCoordinator是对于数据存取的封装,封装了具体的加载/存储的实现细节


       下面还是通过代码来看比较清晰,首先来看Xcode用于Core Data的辅助工具

        

        编辑数据类型结束之后,Xcode会自动生成不少代码,其中每个Entity都会实现成一个类,Xcode会自动生成.h和.m文件

        

        这个类实现的很简单,就是把属性列了一下,我们来看一下Event类的代码

@interface Event : NSManagedObject@property (nonatomic, retain) NSDate * creationDate;
@property (nonatomic, retain) NSNumber * latitude;
@property (nonatomic, retain) NSNumber * longitude;@end
    
@implementation Event@dynamic creationDate;
@dynamic latitude;
@dynamic longitude;@end

        除了这几个类之外,应用的Delegate也有巨大的改变,ManagedObjectModel/ManagedObjectContext都在这里生成。

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

        有了这些之后,我们来看数据的具体操作,假定我们要生成一个Event数据对象,并赋予当前的位置的值,然后存储起来

        Event *event = (Event*)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:self.managedObjectContext];CLLocationCoordinate2D coordinate = [_location coordinate];[event setCreationDate:[NSDate date]];[event setLatitude:[NSNumber numberWithDouble:coordinate.latitude]];[event setLongitude:[NSNumber numberWithDouble:coordinate.longitude]];NSError *error = nil;if (![self.managedObjectContext save:&error]) {NSLog(@"save new event error! errcode=%d", error.code);}

        NSEntityDescription类是Entity的描述类,这个类有个全局的工厂方法,

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;

       这个方法会生成一个数据对象并添加到managedObjectContext里面。

       对于数据的存储,实用managedObjectContext的save方法,上面的代码生成了一个数据对象,加入了context,然后对数据对象进行了初始化,最后储存起来。

       下面再看一段代码,这段代码用于查询所有的数据对象,并返回满足条件的对象数组

    NSFetchRequest *request = [[NSFetchRequest alloc] init];NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];[request setEntity:entity];NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];[request setSortDescriptors:sortDescriptors];[sortDescriptors release];[sortDescriptor release];NSError *error = nil;NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];if (mutableFetchResults) {self.eventArray = mutableFetchResults;[mutableFetchResults release];}[request release];

        这也是非常常用的一个操作,这里先生成一个fetchRequest,然后告诉request在那个Entity里面查找,设置结束后运行managedObjectContext的executeFetchRequest方法,获得搜索到的所有对象(形成一个数组)

        对数据对象的属性习惯上都是通过KVC来操作的,这里查询实用的是NSSortDescriptor,也可以使用NSPredicate这个类,使用fetchRequest的setPredicate方法设置一下即可。

        对于数据的删除可以使用managedObjectContext的deleteObject方法,最后不要忘记调用save存储。

        简单的数据操作差不多也就这几个内容了,增加,查询,删除,实现起来都很方便。

       

         还有一个提一下,自动生成的数据对象的类(Event等等),里面是没有dealloc方法的,因为Core Data负责数据对象的整个生命周期,也就是说系统会自动的释放数据对象。




http://chatgpt.dhexx.cn/article/5qS5A2Zn.shtml

相关文章

CoreData简单使用

苹果的CoreData框架(不限于)提供了一种数据持久化解决方案,它基于如下结构(图片来源苹果官网): 其中涉及了几个概念: NSManagedObject: 数据库中一条记录在内存的实例。 NSManagedObjectConte…

ios中的coredata的使用

Core Data数据持久化是对SQLite的一个升级,它是ios集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类。 (1)NSManagedObjectModel(被管理的对象模型) 相当于实体,不过它包含 了实体间的关系 (2…

CoreData使用

一、CoreData的简单使用 1.什么是CoreData 先认识一下这几个类 (1)NSManagedObjectContext(被管理的数据上下文) 作用:用来管理所有表的操作,对表的实体对应的数据库中的表的操作(插入,查询,修改…

iOS CoreData的使用

CoreData是一个专门管理数据服务的框架,把OC对象和存储在SQLite文件中的数据进行互相转换,极大地方便了开发者在数据服务方面的开发。 1. 创建CoreData 在文件创建区下,选择【Core Data】下的【Data Model】 输入CoreData的文件名Model.x…

Core Data 概述

Core Data 概述 转载自: http://www.cocoachina.com/newbie/basic/2013/0911/6981.html Core Data可能是OS X和iOS里面最容易被误解的框架之一了,为了帮助大家理解,我们将快速的研究Core Data,让大家对它有一个初步的了解&#x…

CoreData相关01 基础及运用:添加、查询、过滤、排序、分页

CoreData CoreData中几乎不用写数据库操作语句就能完成数据的本地化存储。 CoreData和iOS中的模型对象相联系在一起,只需要操作模型对象的增删改查就可以完成数据的增删改查,不用写SQL语句。 CoreData的存储方式 SQLite NSSQLiteStoreType XML NSXML…

JVM原理分析

JVM原理分析 为什么Java是一种跨平台语言 1、不同系统的JDK下载 JDK里面有:Jre和Jvm,其中就有JVM指令集的不同 JVM主要结构: 栈、堆、方法区、程序计数器、本地方法栈 mian方法的执行 通过类装载子系统进入JVM 其中栈中存放线程 来一个…

JVM实现原理

JVM原理 1、概念简介2、为什么要学习JVM虚拟机?3、JVM怎么学?3.1 内存管理1、jvm运行时数据区 1、概念简介 JVM:JAVA虚拟机JRE:Java运行环境 JREJVM虚拟机Java核心类库支持文件JDK:Java开发工具包 JDKJREJava工具Java…

【JVM调优】JVM原理与性能调优

一、参考资料 今日头条https://www.toutiao.com/i7007696978586976805

JVM原理和调优的理解和学习

JVM原理和调优的理解和学习 一、详解JVM内存模型二、JVM中一次完整的GC流程是怎样的三、GC垃圾回收的算法有哪些四、简单说说你了解的类加载器五、双亲委派机制是什么,有什么好处,怎么打破六、说说你JVM调优的几种主要的JVM参数七、JVM调优八、类加载的机…

JVM原理-jvm内存模型

一、jvm内存模型 结构图 JVM包含两个子系统和两个组件 Class loader(类装载子系统) 根据给定的全限定名类名(如:java.lang.Object)来装载class文件到 Runtime data area运行时数据区中的method area方法区中Execution engine(执行引擎) 执行classes中的指令Runt…

JVM原理-垃圾回收机制及算法

JVM原理-jvm内存模型 jvm内存模型 一、垃圾回收机制算法 1、 判断对象是否回收算法 垃圾收集器在做垃圾回收的时候,首先需要判定的就是哪些内存是需要被回收的,哪些对象是存活的,是不可以被回收的;哪些对象已经死掉了&#xf…

jvm面试原理

1、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组…

JVM原理和JVM内存的整理

JVM原理及JVM内存 JVM原理及JVM内存概念这么说1.JVM的基本过程2.JVM的中的“解释”原理,三个重要机制3.JVM的体系结构4.运行时数据区JVM垃圾回收 JVM原理及JVM内存 之前看了许多JVM原理的文章、写作的大牛们都讲的很透彻,但是私下觉得:写得详…

JVM原理和调优(读这一篇就够了)

前言 抛2个问题: 1、export JAVA_OPTS"-Xms256m -Xmx512m -Xss256m -XX:PermSize512m -XX:MaxPermSize1024m -Djava.rmi.server.hostname136.64.45.24 -Dcom.sun.management.jmxremote.port9315 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.manageme…

JVM工作原理

JVM的生命周期 (1)两个概念:JVM实例和JVM执行引擎实例 JVM实例对应了一个独立运行的java程序,它是进程级别的 JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别的 (2)VM实例的诞生…

JVM原理与实战

JVM原理 类加载流程和内存分配栈帧操作一、JVM垃圾回收算法主动加载的几种方式?符号引用和直接引用1.1 什么是垃圾(Garbage Collection)回收?1.2 引用计数法(Reference Conting)1.3 标记清除法 *(Mark - Sweep)1.4 复制算法 *(Copying)1.4.1 复制算法在JVM中的应用1.…

jvm原理与性能调优

文章目录 一、JVM内存结构 1.运行时数据区 2.直接内存 二、JVM中的对象 1.对象的创建 2.对象的内存布局 3.对象的访问定位 三、垃圾回收算法和垃圾回收器 1. 如何判断对象是已死 2.分代回收理论 3.垃圾回收算法 4.垃圾收集器 四、JVM执行子系统 1.Class文件结构 2.类加载机制 3…

什么是JVM?深入解析JVM原理!

一、JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在J…