CoreData简单使用

article/2025/8/19 20:25:55

苹果的CoreData框架(不限于)提供了一种数据持久化解决方案,它基于如下结构(图片来源苹果官网):

The Core Data Stack


其中涉及了几个概念:

NSManagedObject: 数据库中一条记录在内存的实例。

NSManagedObjectContext: 若干NSManagedObject在内存中的存在空间,或称上下文。除非该上下文执行save动作,否则数据变动一直限于内存中,并不会保存到文件。

NSManagedObjectModel: 数据库的模型表示,是若干数据表的集合。

NSPersistentObjectCoordinator: 作为中间层,根据NSManagedObjectModel帮我们协调不同格式的存储文件。


这里简单记录下CoreData的增、删、查动作。

首先,创建一个Data Model(一张RandomEvent表,包含两个字段,分别是randomNumber和createDate),并初始化:

- (void)initCoreData
{if (nil != self.managedObjectContext) {return ;}NSError *error = nil;NSString *savePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/CDDemo.sqlite"];NSURL *saveUrl = [NSURL fileURLWithPath:savePath];NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil];NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:saveUrl options:nil error:&error]) {NSLog(@"Error: %@", [error localizedDescription]);} else {self.managedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];[self.managedObjectContext setPersistentStoreCoordinator:coordinator];}[coordinator release], coordinator = nil;
}
这里选择的是sqlite格式。

接着,提供一个UITableView以供展示,和两个按钮来响应增删动作。如下图:

点击Add按钮,会生成一个随机数,将这个随机数和生成的时间一起写入数据库。

同时,当增加的记录条数够多的时候,UITableView会定位到新增记录。

- (void)onAddButtonItem:(id)sender
{RandomEvent *randomEvent = (RandomEvent *)[NSEntityDescription insertNewObjectForEntityForName:@"RandomEvent" inManagedObjectContext:self.managedObjectContext];randomEvent.createDate = [NSDate date];randomEvent.randomNumber = [NSNumber numberWithInt:arc4random() % 100];[self saveContext];[self refreshEventsList];if (1) {//tableView is not enough for the list to showNSIndexPath *indexPath = [NSIndexPath indexPathForRow:([self.fetchEventsResult count] - 1) inSection:0];[self.eventTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];}
}


对NSManagedObjectContext的操作只是在内存中进行,需要执行save动作才写到本地文件。

- (BOOL)saveContext
{NSError *error;if (![self.managedObjectContext save:&error]) {NSLog(@"Error: %@", [error localizedDescription]);return NO;}return YES;
}


点击Edit按钮,会让UITableView进入编辑模式,让用户可以删除条目:

- (void)onEditButtonItem:(id)sender
{if ([self.eventTableView isEditing]) {UIBarButtonItem *editButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStyleDone target:self action:@selector(onEditButtonItem:)];self.navigationItem.leftBarButtonItem = editButtonItem;[editButtonItem release], editButtonItem = nil;[self.eventTableView setEditing:NO animated:YES];} else {UIBarButtonItem *editButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(onEditButtonItem:)];self.navigationItem.leftBarButtonItem = editButtonItem;[editButtonItem release], editButtonItem = nil;[self.eventTableView setEditing:YES animated:YES];}
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{NSUInteger row = indexPath.row;if (row < [self.fetchEventsResult count]) {[self.managedObjectContext deleteObject:[self.fetchEventsResult objectAtIndex:row]];[self saveContext];[self refreshEventsList];}
}

最后,获取本地数据进行展示:

- (void)fetchEvents
{NSEntityDescription *entityDesctiption = [NSEntityDescription entityForName:@"RandomEvent" inManagedObjectContext:self.managedObjectContext];NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];[fetchRequest setEntity:entityDesctiption];NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:YES];[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];[sortDescriptor release], sortDescriptor = nil;NSError *error = nil;self.fetchEventsResult = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];if (nil == self.fetchEventsResult) {NSLog(@"Error: %@", [error localizedDescription]);}[fetchRequest release], fetchRequest = nil;
}

#pragma mark - UITableView datasource- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{return 1;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return [self.fetchEventsResult count];
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{static NSString *CellIdentifier = @"RandomEventTableViewCell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];}RandomEvent *randomEvent = (RandomEvent *)[self.fetchEventsResult objectAtIndex:indexPath.row];cell.textLabel.text = [NSString stringWithFormat:@"Random Number : %d", [randomEvent.randomNumber intValue]];return cell;
}



http://chatgpt.dhexx.cn/article/kjuTS9yR.shtml

相关文章

ios中的coredata的使用

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

CoreData使用

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

iOS CoreData的使用

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

Core Data 概述

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

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

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

JVM原理分析

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

JVM实现原理

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

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

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

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

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

JVM原理-jvm内存模型

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

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

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

jvm面试原理

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

JVM原理和JVM内存的整理

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

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

前言 抛2个问题&#xff1a; 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的生命周期 &#xff08;1&#xff09;两个概念&#xff1a;JVM实例和JVM执行引擎实例 JVM实例对应了一个独立运行的java程序&#xff0c;它是进程级别的 JVM执行引擎实例则对应了属于用户运行程序的线程&#xff0c;它是线程级别的 &#xff08;2&#xff09;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…

全面阐述JVM原理

一 JVM入门 1. 什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码…