Core Data 的使用
一、概念
1.Core Data 是数据持久化存储的最佳方式
2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型
在Mac OS X 10.5Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式
3.好处:能够合理管理内存,避免使用sql的麻烦,高效
4.构成:
(1)NSManagedObjectContext(被管理的数据上下文)
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
(2)NSManagedObjectModel(被管理的数据模型)
数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
(3)NSPersistentStoreCoordinator(持久化存储助理)
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
(4)NSManagedObject(被管理的数据记录)
相当于数据库中的表格记录
(5)NSFetchRequest(获取数据的请求)
相当于查询语句
(6)NSEntityDescription(实体结构)
相当于表格结构
(7)后缀为.xcdatamodeld的包
里面是.xcdatamodel文件,用数据模型编辑器编辑
编译后为.momd或.mom文件
二.代码的实现 :
#import "ViewController.h"
#import "Movie.h" //导入框架
#import <CoreData/CoreData.h> @interface ViewController () {
NSManagedObjectContext *manageObjectContext; //上下文 }
@property (weak, nonatomic) IBOutlet UITextField *titleTextField;
@property (weak, nonatomic) IBOutlet UITextField *ratingTextField; - (IBAction)insertAction:(id)sender; - (IBAction)updateAction:(id)sender;
- (IBAction)deleteAction:(id)sender;
- (IBAction)queryAction:(id)sender; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; /* 1.应用程序包的路径
NSLog(@"%@",[[NSBundle mainBundle] resourcePath]); */ //加载文件 (注意加载的文件的类型,由上面程序语句得到)
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"MovieInfo.momd" ofType:nil];
//1.加载数据模型文件 本地文件用fileURLWithPath
NSManagedObjectModel *manageModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:[NSURL fileURLWithPath:filePath]]; //2.持久化数据存储调度器,指定存储的方式,负责应用与数据库之间的操作
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:manageModel]; //3.指定数据库的路径 NSString *dbFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/CoreData.db"];
NSLog(@"dbFilePath = %@",dbFilePath); //4.添加持久化存储的方式(可以是数据库,也可以是XML),并且会打开数据库 NSError *error = nil; [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:dbFilePath] options:nil error:&error];
if (error) {
NSLog(@"打开数据库失败!");
}
else{
NSLog(@"打开数据库成功!"); } //5.存储数据,更新数据 上下文
manageObjectContext = [[NSManagedObjectContext alloc]init]; //将上下文设置到调度器上
[manageObjectContext setPersistentStoreCoordinator:coordinator]; } //插入数据
- (IBAction)insertAction:(id)sender { //6.存储数据,将对象映射到数据库
Movie *movie = [NSEntityDescription insertNewObjectForEntityForName:@"Movie" inManagedObjectContext:manageObjectContext]; movie.title = _titleTextField.text;
movie.rating = @([_ratingTextField.text doubleValue]);
movie.year = [NSDate date]; //将数据添加到上下文
[manageObjectContext insertObject:movie]; //将数据保存到数据库
BOOL isSuccess = [manageObjectContext save:nil];
if (isSuccess) {
NSLog(@"插入数据成功!");
}
else
{
NSLog(@"插入数据失败!");
} } //更新数据
- (IBAction)updateAction:(id)sender { //1.创建请求对象,请求对应的表
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Movie"]; //2设置过滤条件
request.predicate = [NSPredicate predicateWithFormat:@"rating = 3.6"]; //3.查询数据
NSArray *result = [manageObjectContext executeFetchRequest:request error:nil]; //4.遍历查询到的数据
for (Movie *m in result) { /* 更新查询到的电影信息
m.rating = @8.2; NSLog(@"标题:%@,时间:%@,评分:%@",m.title,m.year,m.rating);
*/ //删除查询到的电影信息
[manageObjectContext deleteObject:m];
} //5.保存数据
BOOL isSuccess = [manageObjectContext save:nil]; if (isSuccess) {
NSLog(@"更新数据成功!");
}
else{
NSLog(@"更新数据失败!"); } } //删除数据 删除查询到的电影信息数据
- (IBAction)deleteAction:(id)sender { // [manageObjectContext deleteObject:<#(NSManagedObject *)#>];
} //查询数据 request
- (IBAction)queryAction:(id)sender { //1.创建请求对象,请求对应的表
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Movie"]; //2.使用谓词设置过滤条件 /*
// 注意条件参数的单引号
NSString *str = [NSString stringWithFormat:@"title = '%@'",@"金刚狼"];
request.predicate = [NSPredicate predicateWithFormat:str];
*/ //3.模糊查询
NSString *str = [NSString stringWithFormat:@"title like '%@'",@"*q*"];
request.predicate = [NSPredicate predicateWithFormat:str]; //4.设置排序
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self.rating" ascending:YES];
request.sortDescriptors = @[sortDescriptor]; //5.设置分页查询
request.fetchOffset = ; //设置起始位置
request.fetchLimit = ; //设置查询的数据条数 //6.查询数据
NSArray *result = [manageObjectContext executeFetchRequest:request error:nil];
for (Movie *m in result) { NSLog(@"标题:%@,时间:%@,评分:%@",m.title,m.year,m.rating);
} }
Core Data 的使用的更多相关文章
- iOS之Core Data及其线程安全
一.简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对 ...
- Core Data的一些常见用法
一.简介 Core Data是一个纯粹的面向对象框架,其本质就是一个ORM(对象关系映射:Object Relational Mapping),能以面向对象的方式操作SQLite数据库.在实际开发中绝 ...
- Core Data 使用映射模型
Core Data 使用映射模型 如果新版本的模型存在较复杂的更改,可以创建一个映射模型,通过该模型指定源模型如何映射到目标模型. 创建映射模型,新建File, Core Data 选择Mappin ...
- SELF, self in CORE DATA
Predicate SELF Represents the object being evaluated. CORE DATA Retrieving Specific Objects If your ...
- Core Data浅谈初级入门
Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数 ...
- Core Data
• Core Data 是 iOS SDK 里的一个很强大的框架,允许程序员 以面向对象 的方式储存和管理数据 .使用 Core Data 框架,程序员可以很轻松有效 地通过面向对象的接口 ...
- iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】
在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...
- 我为什么用 SQLite 和 FMDB 而不用 Core Data
凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和 ...
- Core Data 概述
Core Data是一个模型层的技术.Core Data帮助你建立代表程序状态的模型层.Core Data也是一种持久化技术,它能将模型对象的状态持久化到磁盘,但它最重要的特点是:Core Data不 ...
- 《驾驭Core Data》 第三章 数据建模
本文由海水的味道编译整理,请勿转载,请勿用于商业用途. 当前版本号:0.1.2 第三章数据建模 Core Data栈配置好之后,接下来的工作就是设计对象图,在Core Data框架中,对象图被表 ...
随机推荐
- 图片下载---使用gevent爬数据
代码: import urllib.request import gevent from gevent import monkey monkey.patch_all() def downloader( ...
- Vue.js最佳实践(五招助你成为vuejs大师)
转自https://www.jb51.net/article/139448.htm 本文面向对象是有一定Vue.js编程经验的开发者.如果有人需要Vue.js入门系列的文章可以在评论区告诉我,有空就给 ...
- React应用数据传递的方式
1. props属性 典型的React应用,数据通过props按照自上而下(父->子)的顺序传递数据. 2. Context传值 1. 应用场景 对于一些应用中全局性的属性(如UI主题.语言.登 ...
- LOJ P10147 石子合并 题解
Analysis 区间dp+前缀和 #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- Elasticsearch 调优之 搜索速度优化
本章讨论搜索速度优化:搜索速度与系统资源.数据索引方式.查询方式等多方面 1.为文件系统cache预留足够的内存 1)应用程序一般情况下,读写都会被操作系统“cache” 2)cache保存在物理内存 ...
- asp.net文件夹上传源码
ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...
- 模拟I2C协议学习点滴之原理框架
I2C是一种串行总线协议. 目前几种常用的串行总线有UART.SPI和I2C协议.UART协议的总线只有两条,发送(Transmit:TX)和接收(Receive:RX),没有时钟信号,这就要求两位数 ...
- TensorFlow(六):tensorboard网络结构
# MNIST数据集 手写数字 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # ...
- (转)实验文档4:kubernetes集群的监控和日志分析
改造dubbo-demo-web项目为Tomcat启动项目 Tomcat官网 准备Tomcat的镜像底包 准备tomcat二进制包 运维主机HDSS7-200.host.com上:Tomcat8下载链 ...
- python下载后出现python 已停止工作
背景: 在执行IDLE或者在terminal窗口执行 python命令时出现如下提示,修改了防火墙关闭也不行,找不到解决办法? 如图: [解决方案] 1.卸载重装python,确保python版本与系 ...