码迷,mamicode.com
首页 > 其他好文 > 详细

数据处理之CoreData框架

时间:2016-05-17 22:31:26      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

CoreData只是个框架,并不是数据库.

CoreData最大的优点就是可以将普通的数据当成“程序猿”们最喜欢的对象来操作,而不必去在意数据在磁盘上的存储方式,并且CoreData可以合理的管理内存,使用起来更加高效。

1.CoreData中的关键类

  • NSManagedObjectModel(被管理的对象模型):
    数据库所有表格或数据结构,包含各实体的定义信息
    作用:添加实体的属性,建立属性之间的关系
    操作方法:视图编辑器,或代码
  • NSManagedObjectContext(被管理的对象上下文)
    操作实际内容(操作持久层)
    作用:插入,更新,查询,删除数据
  • NSManagedObject(被管理的数据对象)
    相当于数据库中的一条记录
  • NSPersistentStoreCoordinator(持久化存储协调器)
    相当于数据库的连接器
    作用:设置数据存储的名字,位置,存储方式,和存储时机
  • NSFetchRequest(获取数据的请求)
    相当于数据库的查询语句
  • NSPredicate(谓词)
    查询数据的过滤条件
  • NSEntityDescription(实体描述)
    对实体结构的描述

2.模型文件

CoreData给我们提供了对象 — 关系映射功能,可以将对象模型转成关系模型,也就是把OC中的对象转化成数据库中的数据,同时也可以将数据库中的数据还原成OC中的对象。 CoreData将需要进行映射的对象称作实体(Entity),每个实体都可以拥有许多属性(Attributes),不同的实体之间还可以拥有一些关联关系(Relationships)。而这一切都建立在模型文件的基础上的。(在创建工程的时候勾选use coredata即可直接可视化添加实体,属性及关系).

技术分享

 

3.创建NSManagedObject的子类

在默认情况下,实体的数据类型都是NSManagedObject类型的,可以通过键值编码的方式存取数据。这样存取稍显麻烦,而且在项目中可能不满足于数据的存取,还会需要添加一些业务方法去处理其他的任务,这个时候就需要创建NSManagedObject的子类了。

技术分享

勾选对应的entity文件就可以自动创建.

直接引入AppDelegate.h(之前勾选过use coredata,AppDelegate.h中会自动引入#import <CoreData/CoreData.h>),不需要我们自己再创建相对应的类.

技术分享

接下来我们可以直接在工程中调用系统给我们创建好的coredata框架.代码如下:

技术分享
  1 #import "ViewController.h"
  2 //第一步引入头文件AppDelegate.h
  3 #import "AppDelegate.h"
  4 //引入person.h
  5 #import "Person.h"
  6 //引入car
  7 #import "Car.h"
  8 @interface ViewController ()
  9 
 10 //第二步:声明属性[管理对象上下文]sqlite中是声明一个存储路径的属性
 11 @property (nonatomic, strong)NSManagedObjectContext *managedObjectContext;
 12 
 13 @end
 14 
 15 @implementation ViewController
 16 
 17 //懒加载
 18 - (NSManagedObjectContext *)managedObjectContext {
 19     //因为在Appdelegate中已经实现了.所以在这里是从appdelegate中去获取
 20     
 21     if (_managedObjectContext == nil) {
 22 //        获取appdelegate对象
 23         AppDelegate *appdelegate = [UIApplication sharedApplication].delegate;   //单例
 24         _managedObjectContext = appdelegate.managedObjectContext;
 25     }
 26     return _managedObjectContext;
 27 }
 28 
 29 - (void)viewDidLoad {
 30     [super viewDidLoad];
 31     // Do any additional setup after loading the view, typically from a nib.
 32     
 33     //添加person
 34     [self addPerson];
 35     
 36     //删除person
 37 //    [self deletePerson];
 38     
 39 //    更改person信息
 40     [self updatePerson];
 41     
 42     //查询person信息
 43     [self selectAllPerson];
 44     
 45 }
 46 
 47 #pragma mark - 添加人
 48 - (void)addPerson {
 49     //添加的步骤
 50     //1.创建person实体对象,然后告诉"Context",让他做好准备,将这个对象添加到数据库中
 51     //实例对象有两种方式,初始化实体对象需要借用NSEntityDescription
 52     //1.第一个参数:表名,第二个参数
 53 //    Person *per = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
 54     
 55     //2.先创建一个实体
 56     NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
 57     //创建person对象
 58     Person *per = [[Person alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:self.managedObjectContext];
 59     //给对象属性赋值
 60     per.name = @"MBBoy";
 61     per.gender = @"Unknow";
 62     per.age = @10;
 63     
 64     //将车的对象通过实体描述类创建出来 //与左边文件的类名保持一致
 65     Car *audiCar = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:self.managedObjectContext];
 66     audiCar.price = @300000;
 67     audiCar.color = @"白色";
 68     audiCar.brand = @"奥迪A7";
 69     
 70     Car *benzCar = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:self.managedObjectContext];
 71     
 72     benzCar.price = @500000;
 73     benzCar.color = @"红色";
 74     benzCar.brand = @"SUV";
 75     //将两辆车放在集合中存储然后进行赋值
 76     NSSet *carSet = [NSSet setWithObjects:audiCar, benzCar, nil];
 77     per.personCar = carSet;
 78     
 79     
 80     
 81     //将person对象存入数据库
 82    BOOL result = [_managedObjectContext save:nil];
 83     //判断数据是否存储成功
 84     if (result) {
 85         NSLog(@"添加数据成功");
 86     } else {
 87         NSLog(@"添加数据失败");
 88     }
 89 }
 90 
 91 #pragma mark - //删除person
 92 - (void)deletePerson {
 93     //实体化请求类[查询](先找到这个表)
 94     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
 95     //.根据条件删除内容(找条件)谓词
 96     request.predicate = [NSPredicate predicateWithFormat:@"name = ‘MBBoy‘"];
 97     //由context根据删除条件的请求去具体进行删除操作
 98     NSArray *resultArray = [self.managedObjectContext executeFetchRequest:request error:nil];
 99     //遍历搜索出来的结果
100     for (Person *per in resultArray) {
101         //删除查询到的相关的人的信息
102         [self.managedObjectContext deleteObject:per];
103         
104     }
105     //进行删除结果的判断
106     BOOL result = [_managedObjectContext save:nil];
107     if (result) {
108         NSLog(@"删除成功");
109     } else {
110         NSLog(@"删除失败");
111     }
112 }
113 
114 #pragma mark - 更改person信息
115 - (void)updatePerson {
116 //    1.实例化查询请求类
117     NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
118     //设置谓词
119     fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name = ‘MBBoy‘"];
120     
121     //由管理对象上下文‘context‘,按照查询条件进行相关的操作
122     NSArray *resultArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
123     //遍历结果更新相关的信息
124     for (Person *per in resultArray) {
125         //更改相关的信息
126         per.name = @"小强";
127         per.gender = @"暖男";
128         per.age = @38;
129         NSLog(@"%@, %@, %@", per.name, per.gender, per.age);
130         NSLog(@"%ld", resultArray.count);
131     }
132     
133     //进行更新结果的接收
134     BOOL result = [_managedObjectContext save:nil];
135     if (result) {
136         NSLog(@"更新成功");
137     } else {
138         NSLog(@"更新失败");
139     }
140 }
141 
142 #pragma mark - 查询相关的信息
143 - (void)selectAllPerson {
144     //1.实例化查询请求
145     NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
146     //设置查询条件
147     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE ‘*强‘"];
148     fetchRequest.predicate = predicate;
149     //根据管理对象上下文执行相关的操作
150     NSArray *resultArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
151     //遍历数组查询结果
152     for (Person *per in resultArray) {
153         NSLog(@"++======++++%@, %@, %@", per.name, per.gender, per.age);
154 
155     }
156 
157     
158 }
159 
160 #pragma mark - 更新车的相关信息
161 - (void)updateCar {
162     //实例化查询请求
163     
164     NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Car"];
165     //设置查询条件
166     fetchRequest.predicate = [NSPredicate predicateWithFormat:@"brand CONTAINS ‘奥迪A7‘"];
167     //管理对象上下文按照查询条件去查询
168     NSArray *resultArray = [_managedObjectContext executeFetchRequest:fetchRequest error:nil];
169     for (Car *car in resultArray) {
170         NSLog(@"%@, %@, %@",car.price, car.color, car.brand);
171         car.brand = @"宝马X5";
172     }
173     //保存结果
174     BOOL result = [_managedObjectContext save:nil];
175     if (result) {
176         NSLog(@"更改成功");
177     } else {
178         NSLog(@"更改失败");
179     }
180 }
coredata框架的使用

所有的增,删,改,查/都与上下文对象密切相关,可以说NSManagedObjectContext是我们的执行中介,一切活动都需要通过这个中介来执行.

 

数据处理之CoreData框架

标签:

原文地址:http://www.cnblogs.com/lovebugssun/p/5503253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!