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----装饰器(几种常见方式的使用与理解)
更详细的装饰器,真心实力推荐,里面介绍的很清楚,介绍可见链接:https://blog.csdn.net/buster_zr/article/details/81104551 1.装饰器的理论: (1 ...
- java中创建对象的方式
Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码 使用new关键字 } → 调用了构造函数 使用Class类的newInstance方法 } → 调用了构造函数 使用Construc ...
- 入门指引之查看accesstoken
1. 测试工具查看 https://mp.weixin.qq.com/debug/ 2. 代码获取: # -*- coding: utf-8 -*- # filename: basic.py impo ...
- LOJ P10116 清点人数 题解
每日一题 day13 打卡 Analysis 用简单的树状数组维护单点修改和查询就行了 #include<iostream> #include<cstdio> #include ...
- 浅谈"$fake$树"——虚树
树形$dp$利器——"$fake$"树(虚树$qwq$) 前置知识: $1.$$dfs$序 $2.$倍增法或者树链剖分求$lca$ 问题引入: 在许多的树形动规中,很多时候点特 ...
- 使用Newtonsoft.Json将数据导出至Json文件
导出方法: /// <summary> /// 导出文件 /// </summary> public void Export(List<Dict> dicts, s ...
- 2-set 1823: [JSOI2010]满汉全席
这个题告诉我变量循环使用,一定要赋好初值!!!!!! 一定要赋好初值!!!!!!一定要赋好初值!!!!!!一定要赋好初值!!!!!! #include<iostream>#include& ...
- 2018 Benelux Algorithm Programming Contest (BAPC 18)
目录 Contest Info Solutions A A Prize No One Can Win B Birthday Boy C Cardboard Container D Driver Dis ...
- 设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。
设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件. 我实现的功能是提供父目录(兄弟目录),输入文件名,创建树型目录结构,文本文件不可以再有子目录 ...
- linux下redis的安装、启动、关闭和卸载
edis 在Linux 和 在Windows 下的安装是有很大的不同的,和通常的软件安装是一样的. 一 下载 Redis 安装包 去redis 官网下载reids 安装包, redis 官网默认只提 ...