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框架中,对象图被表 ...
随机推荐
- 微信H5支付时用户有微信分身停留5秒后未选择哪个微信分身,也未支付就被动回调到商户支付是否完成的页面
微信H5支付时用户有微信分身停留5秒后未选择哪个微信分身,也未支付就被动回调到商户支付是否完成的页面 微信支付中间页调起微信收银台后超过5秒 安卓H5支付设置了redirect_url后调起微信收银台 ...
- hive 常用操作
参考:https://www.cnblogs.com/jonban/p/10779938.html Hive 启动:hive 退出:hive>quit; show databases; use ...
- POJ-2065-SETI(高斯消元)
链接: https://vjudge.net/problem/POJ-2065 题意: For some years, quite a lot of work has been put into li ...
- java线程中yield(),sleep(),wait()区别详解
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- bootstrap-wysihtml5 ckeditor 修改富文本编辑器可以上传图片
bootstrap-wysihtml5 ckeditor 修改富文本编辑器可以上传图片 bootstrap-wysihtml5实际使用内核为ckeditor 故这里修改ckeditor即可 ...
- xml介绍+xml创建+xml读取
1.xml介绍:(URL:https://blog.csdn.net/weixin_37861326/article/details/81082144) xml是用来传输内容的,是w3c推荐的 2.使 ...
- CSPS模拟86-87
模拟86 T1,烧水,按位统计贡献,利用某种sao操作避免数位dp #include<iostream> #include<cstdio> #include<cstrin ...
- linux 下搭建ELK(rpm包版)
一.安装环境查看 注意:新的安装包要在centos 7.x的版本上安装 二.软件版本选用 注意:这边根据实际情况 jdk 1.8.0_171 #jdk安装这边就不说了 elasticsearch-7. ...
- $.extend和$.fn.extend详解
一.定义 $.extend()属于j全局的Query对象,用于将一个或多个对象合并到目标对象上: $.fn.extend()属于jQuery的原型对象,用于在jQuery原型上扩展实例属性和方法. 二 ...
- ansible 问题记录(2)
普通用户执行ansible,但是在远程需要root权限,这个时候执行ansible命令报如下错误: 经分析是由于sudo的时候,普通用户没有在sudoer文件 2.在playbook里面使用sudo认 ...