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文件

二.代码的实现 :

  1 #import "ViewController.h"
  2 #import "Movie.h"
  3
  4 //导入框架
  5 #import <CoreData/CoreData.h>
  6
  7
  8 @interface ViewController ()
  9
 10 {
 11     NSManagedObjectContext *manageObjectContext;  //上下文
 12
 13 }
 14 @property (weak, nonatomic) IBOutlet UITextField *titleTextField;
 15 @property (weak, nonatomic) IBOutlet UITextField *ratingTextField;
 16
 17
 18
 19 - (IBAction)insertAction:(id)sender;
 20
 21 - (IBAction)updateAction:(id)sender;
 22 - (IBAction)deleteAction:(id)sender;
 23 - (IBAction)queryAction:(id)sender;
 24
 25 @end
 26
 27 @implementation ViewController
 28
 29 - (void)viewDidLoad {
 30     [super viewDidLoad];
 31
 32     /*
 33
 34     1.应用程序包的路径
 35       NSLog(@"%@",[[NSBundle mainBundle] resourcePath]);
 36
 37      */
 38
 39     //加载文件  (注意加载的文件的类型,由上面程序语句得到)
 40     NSString *filePath = [[NSBundle mainBundle]pathForResource:@"MovieInfo.momd" ofType:nil];
 41     //1.加载数据模型文件  本地文件用fileURLWithPath
 42     NSManagedObjectModel *manageModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
 43
 44     //2.持久化数据存储调度器,指定存储的方式,负责应用与数据库之间的操作
 45     NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:manageModel];
 46
 47     //3.指定数据库的路径
 48
 49     NSString *dbFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/CoreData.db"];
 50     NSLog(@"dbFilePath = %@",dbFilePath);
 51
 52     //4.添加持久化存储的方式(可以是数据库,也可以是XML),并且会打开数据库
 53
 54     NSError *error = nil;
 55
 56     [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:dbFilePath] options:nil error:&error];
 57     if (error) {
 58         NSLog(@"打开数据库失败!");
 59     }
 60     else{
 61         NSLog(@"打开数据库成功!");
 62
 63     }
 64
 65     //5.存储数据,更新数据  上下文
 66     manageObjectContext = [[NSManagedObjectContext alloc]init];
 67
 68     //将上下文设置到调度器上
 69     [manageObjectContext setPersistentStoreCoordinator:coordinator];
 70
 71
 72 }
 73
 74
 75 //插入数据
 76 - (IBAction)insertAction:(id)sender {
 77
 78
 79     //6.存储数据,将对象映射到数据库
 80     Movie *movie = [NSEntityDescription insertNewObjectForEntityForName:@"Movie" inManagedObjectContext:manageObjectContext];
 81
 82     movie.title = _titleTextField.text;
 83     movie.rating = @([_ratingTextField.text doubleValue]);
 84     movie.year = [NSDate date];
 85
 86     //将数据添加到上下文
 87     [manageObjectContext insertObject:movie];
 88
 89     //将数据保存到数据库
 90     BOOL isSuccess = [manageObjectContext save:nil];
 91     if (isSuccess) {
 92         NSLog(@"插入数据成功!");
 93     }
 94     else
 95     {
 96         NSLog(@"插入数据失败!");
 97     }
 98
 99
100 }
101
102
103 //更新数据
104 - (IBAction)updateAction:(id)sender {
105
106     //1.创建请求对象,请求对应的表
107     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Movie"];
108
109     //2设置过滤条件
110     request.predicate = [NSPredicate predicateWithFormat:@"rating = 3.6"];
111
112     //3.查询数据
113     NSArray *result = [manageObjectContext executeFetchRequest:request error:nil];
114
115     //4.遍历查询到的数据
116     for (Movie *m in result) {
117
118         /* 更新查询到的电影信息
119          m.rating = @8.2;
120
121          NSLog(@"标题:%@,时间:%@,评分:%@",m.title,m.year,m.rating);
122          */
123
124         //删除查询到的电影信息
125         [manageObjectContext deleteObject:m];
126     }
127
128     //5.保存数据
129     BOOL isSuccess = [manageObjectContext save:nil];
130
131     if (isSuccess) {
132         NSLog(@"更新数据成功!");
133     }
134     else{
135         NSLog(@"更新数据失败!");
136
137     }
138
139 }
140
141
142 //删除数据  删除查询到的电影信息数据
143 - (IBAction)deleteAction:(id)sender {
144
145
146    // [manageObjectContext deleteObject:<#(NSManagedObject *)#>];
147 }
148
149
150 //查询数据 request
151 - (IBAction)queryAction:(id)sender {
152
153     //1.创建请求对象,请求对应的表
154     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Movie"];
155
156     //2.使用谓词设置过滤条件
157
158     /*
159     // 注意条件参数的单引号
160     NSString *str = [NSString stringWithFormat:@"title = ‘%@‘",@"金刚狼"];
161     request.predicate = [NSPredicate predicateWithFormat:str];
162     */
163
164     //3.模糊查询
165     NSString *str = [NSString stringWithFormat:@"title like ‘%@‘",@"*q*"];
166     request.predicate = [NSPredicate predicateWithFormat:str];
167
168
169     //4.设置排序
170     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self.rating" ascending:YES];
171     request.sortDescriptors = @[sortDescriptor];
172
173     //5.设置分页查询
174     request.fetchOffset = 0;   //设置起始位置
175     request.fetchLimit = 3;     //设置查询的数据条数
176
177     //6.查询数据
178     NSArray *result = [manageObjectContext executeFetchRequest:request error:nil];
179     for (Movie *m in result) {
180
181         NSLog(@"标题:%@,时间:%@,评分:%@",m.title,m.year,m.rating);
182     }
183
184 }
时间: 2024-10-31 03:16:28

Core Data 的使用的相关文章

Core Data

简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的.简单地用下图描述下它的作用: 左边是关系模型,即数据库,数据库里面有张person表,person表里面有id.name.age三个字段,而且有2条记录: 右

我为什么用 SQLite 和 FMDB 而不用 Core Data

转:http://segmentfault.com/a/1190000000363392 编者注:文章的"我"是指原作者. 凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和精力去写自己的系统去代替它.真的,使用Core Data吧. 为什么我不使用Core Data Mike Ash写到: 就我自己而言,我不是个狂热粉丝.我发现API是

Core Data存储自定义类型数据

目录: 一.使用CoreData存储基本数据 二.使用CoreData存储自定义类型数据 简单介绍CoreData CoreData是iOS编程中使用持久化数据存储的一种方式,我们知道CoreData并不是数据库本身,而是Apple提供的对象持久化技术--Object Persistent technology.CoreData框架为我们的数据变更.管理.对象存储.读取和恢复提供了支持.下面我们来尝试创建一个简单的CoreData Project. 操作 1. 打开x-code,为你的proje

Core Data使用之一(Swift): 保存

Core Data 用于永久化数据,它是基于SQLite数据库的保存一门技术. 那么,在Swift中,它是如何实现的呢? 首先,需要新建一个模板,打开工程中的xcdatamodeld文件,点击“Add Entity” ,这时候,就创建的一个模板.之后,可以修改模板的名称为自己想要的名称.然后,在Attributes里面,点击“+”,添加字段并修改类型. 然后,在代码里面 “import CoreData”.接着,用NSManagedObject来保存对象,它可以转换成任何对象.它的类型是字典.

Chapter 23 Core Data

1.  Core Data is only able to store certain data types in its store, and UIImage is not one of these types. Instead, you declared the UIImage as transformable. With a transformable attribute, Core Data will convert the object into NSData when saving,

Core Data浅谈系列之十 : 关于数据模型中实体的属性

之前写了<Core Data浅谈系列汇总>,今天稍微回顾了下,做些补充. 在这个系列的第一篇<基础结构>中(2013年1月份的文章,时间过得好快啊!),有简单带过Entity的Attribute: 数据类型.布尔值统一用NSNumber来表示: 字符串类型用NSString表示: 时间类型用NSDate表示: 二进制数据类型用NSData表示: 非标准类型用Transformable来表示: 而Attribute还有其自身的Properties,比如Transient表示不用持久化

iOS Core data多线程并发访问的问题

大家都知道Core data本身并不是一个并发安全的架构:不过针对多线程访问带来的问题,Apple给出了很多指导:同时很多第三方的开发者也贡献了很多解决方法.不过最近碰到的一个问题很奇怪,觉得有一定的特殊性,与大家分享一下. 这个问题似乎在7.0.1以前的版本上并不存在:不过后来我升级版本到了7.0.4.app的模型很简单,主线程在前台对数据库进行读写,而后台线程不断地做扫描(只读).为此每个线程中各创建了一个NSManagedObjectContext. 这个模型其实有点奇怪,因为普遍的模型是

iOS开发学习之Core Data

1.添加DataModel文件 2.添加实体和属性 3.创建NSManagedObject的子类,这里命名为Location(若没有实体属性类型是Transformable或没有额外的方法,只需要存储基本类型的话,可略过) 注意:这里可以做一个额外的工作,在Location+CoreDataProperties.h文件中,将实体属性类型是Transformable对应的@property属性的类型从id改为需要的类型 4.在AppDelegate.m文件添加以下代码: @interface Ap

Core Data-备用

Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需任何SQL知识就能操作他们. Core Data位于MVC设计模式中的模型层,一般需要在设备上存储结构化数据时,考虑使用SQLite或是序列化等方法,而Core Data是这两种方法的混合体,并增加了一些功能,提供了SQL强大威力,但是用起来又和序列化一样简单.Core Data能将应用程序中的对象

UIKit,Core Data , Core Graphics, Core Animation,和OpenGLES框架

iOS的主要框架介绍 框架是一个目录,这个目录包含了共享库,访问共享库里代码的头文件,和其它的图片和声音的资源文件.一个共享库定义的方法或函数可以被应用程序调用. IOS提供了很多你可以在应用程序里调用的框架.要使用一个框架,需要将它添加到你的项目中,你的项目才可以使用它.许多应用程序都使用了如Foundation.UIKit.和Core Graphics这些框架.根据你为应用程序选择的模版,相关的框架就已经被自动引入了.如果默认加入的框架不能满足你的应用程序的需求,你也可以加入需要的框架. 看