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框架中,对象图被表 ...
随机推荐
- python 'NoneType' object has no attribute 'get'
获取 页面链接的时候报错 'NoneType' object has no attribute 'get' href = div.find("a").get("href& ...
- 使用jQuery快速高效制作网页交互特效--初始jQuery
一. jQuery基本概念介绍 1.1 什么是jQuery一个javascript库,把常用方法写到一个js文件中,需要的时候直接调用即可学习jQuery就是学习一些方法 ...
- 微信&QQ中打开网页提示“已停止访问该网页”是怎么回事?
背景 大家是不是经常会遇到这种情况,分享出去的网页链接在微信里或者QQ里打开会提示“已停止访问该网页”,当大家看到这种的提示的时候就说明你访问的网页已经被腾讯拦截了. 当大家遇到以上这种情况的时候要怎 ...
- Codeforces Round #459 (Div. 2) C题【思维好题--括号匹配问题】
题意:给出一个串,只包含 ( ? ) 三种符号,求出有多少个子串是完美匹配的. ( ) ? ) => ( ) ( ) 完美匹配( ( ) ? => ( ( ) )完美匹配? ? ? ? = ...
- Promise.then方法的执行顺序例题分析
1. 当Promise对象作为resolve的参数时 const p = Promise.resolve(); const p1 = Promise.resolve(p); //就是p const p ...
- Vue.js-组件化前端开发新思路
Vue.js-组件化前端开发新思路 12017.04.14 18:31:25字数 6228阅读 5632 本文章是我最近在公司的一场内部分享的内容.我有个习惯就是每次分享都会先将要分享的内容写成文章. ...
- PostgreSQL 多版本的实现与Innodb和oracle的差别
PostgreSQL与oracle或InnoDB的多版本实现最大的区别在于最新版本和历史版本是否分离存储,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分离了数据,索引 ...
- 自定义starter
https://github.com/deadzq/spring-boot-starter-hello 父子项目 子项目引用父项目中的依赖和配置参数
- P4556 雨天的尾巴 线段树合并
使用线段树合并,每个节点维护一棵权值线段树,下标为救济粮种类,区间维护数量最多的救济粮编号(下标).所以每个节点答案即为\(tre[rot[x]]\). 然后运用树上点的差分思想,对于分发路径\(u, ...
- BZOJ 4570: [Scoi2016]妖怪
二次联通门 : BZOJ 4570: [Scoi2016]妖怪 二次联通门 : luogu P3291 [SCOI2016]妖怪 LibreOJ : LibreOJ #2015. 「SCOI2016 ...