Core Data框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。
在此数据操作期间,不需要编写任何SQL语句。
使用此功能,要添加CoreData.framework和导入主头文件<CoreData/CoreData.h>
◦ 优点:能够合理管理内存,避免使用sql的麻烦,高效
◦ 缺点:它使基于SQLite的,所以并没有SQLite高效
我们创建项目的时候,最好不好勾选Core data那个选项,因为我可能需要用到多个数据库,按照自己的需求来创建比较方便。
开发步骤总结:
1.初始化NSManagedObjectModel对象,加载模型文件,读取app中的所有实体信息
2.初始化NSPersistentStoreCoordinator对象,添加持久化库(这里采取SQLite数据库)
3.初始化NSManagedObjectContext对象,拿到这个上下文对象操作实体,进行CRUD操作
//
// ViewController.m
// CoreData
//
// Created by HZhenF on 2017/5/31.
// Copyright © 2017年 Huangzhengfeng. All rights reserved.
//
#import "ViewController.h"
#import <CoreData/CoreData.h>
#import "Person.h"
@interface ViewController ()
@property(nonatomic,strong) NSManagedObjectContext *context;
@property(nonatomic,strong) UIButton *btn1;
@property(nonatomic,strong) UIButton *btn2;
@property(nonatomic,strong) UIButton *btn3;
@property(nonatomic,strong) UIButton *btn4;
@property(nonatomic,strong) UIButton *btn5;
@end
@implementation ViewController
-(UIButton *)btn1
{
if (!_btn1) {
_btn1 = [[UIButton alloc] initWithFrame:CGRectMake(0, 100, 100, 100)];
_btn1.backgroundColor = [UIColor grayColor];
_btn1.titleLabel.font = [UIFont systemFontOfSize:12.0];
[_btn1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_btn1 addTarget:self action:@selector(createDBContext) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_btn1];
}
return _btn1;
}
-(UIButton *)btn2
{
if (!_btn2) {
_btn2 = [[UIButton alloc] initWithFrame:CGRectMake(250, 100, 100, 100)];
_btn2.titleLabel.font = [UIFont systemFontOfSize:12.0];
_btn2.backgroundColor = [UIColor cyanColor];
[_btn2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_btn2 addTarget:self action:@selector(onClickSearchAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_btn2];
}
return _btn2;
}
-(UIButton *)btn3
{
if (!_btn3) {
_btn3 = [[UIButton alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.btn1.frame) + 100, 100, 100)];
_btn3.titleLabel.font = [UIFont systemFontOfSize:12.0];
_btn3.backgroundColor = [UIColor yellowColor];
[_btn3 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_btn3 addTarget:self action:@selector(insertMessage) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_btn3];
}
return _btn3;
}
-(UIButton *)btn4
{
if (!_btn4) {
_btn4 = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMinX(self.btn2.frame), CGRectGetMaxY(self.btn2.frame) + 100, 100, 100)];
_btn4.titleLabel.font = [UIFont systemFontOfSize:12.0];
_btn4.backgroundColor = [UIColor orangeColor];
[_btn4 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_btn4 addTarget:self action:@selector(onClickDeleteAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_btn4];
}
return _btn4;
}
-(UIButton *)btn5
{
if (!_btn5) {
_btn5 = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.btn3.frame) + 25, CGRectGetMaxY(self.btn3.frame) + 20, 100, 100)];
_btn5.titleLabel.font = [UIFont systemFontOfSize:12.0];
_btn5.backgroundColor = [UIColor greenColor];
[_btn5 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_btn5 addTarget:self action:@selector(onClickModifyAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_btn5];
}
return _btn5;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.btn1 setTitle:@"创建数据库上下文" forState:UIControlStateNormal];
[self.btn2 setTitle:@"查询数据" forState:UIControlStateNormal];
[self.btn3 setTitle:@"插入数据" forState:UIControlStateNormal];
[self.btn4 setTitle:@"删除数据" forState:UIControlStateNormal];
[self.btn5 setTitle:@"修改数据" forState:UIControlStateNormal];
// NSLog(@"%@",NSHomeDirectory());
}
-(NSManagedObjectContext *)createDBContext
{
//1.创建模型对象
NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:@"MyCoreData" withExtension:@"momd"];
//根据模型文件创建模型对象
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
//打开模型文件,参数为nil则打开包中所有模型文件合并成一个
// NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
//2.创建持久化助理
//利用模型对象创建助理对象
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//数据库的名称和路径
NSString *docStr = @"/Users/huangzhenfeng/Desktop";
NSString *sqlPath = [docStr stringByAppendingPathComponent:@"mySqlite1.sqlite"];
NSLog(@"sqlPath = %@",sqlPath);
NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath];
//设置数据库相关信息
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil
URL:sqlUrl options:nil error:nil];
NSError *error;
NSManagedObjectContext *context = nil;
if (!error) {
//3.创关键上下文
context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
//关联持久化助理
[context setPersistentStoreCoordinator:store];
NSLog(@"数据库打开成功!");
}
else
{
NSLog(@"数据库打开失败!错误:%@",error.localizedDescription);
}
self.context = context;
return context;
}
//插入数据
-(void)insertMessage
{
//创建一个对象
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.context];
person.name = @"HZhenF";
person.age = 21;
//保存信息
NSError *error = nil;
if ([self.context save:&error]) {
NSLog(@"插入数据成功");
}
else
{
NSLog(@"添加过程发生错误,错误信息:%@",error.localizedDescription);
}
}
-(void)onClickSearchAction
{
// NSArray *arr = [self searchMessage:@"HZhenF"];
NSArray *arr = [self searchMessage:@"F"];
for (Person *p in arr) {
NSLog(@"name = %@----age = %d",p.name,p.age);
}
}
//查询数据
-(NSArray *)searchMessage:(NSString *)name
{
//创建查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
//创建谓词,设置获取数据的条件
// request.predicate = [NSPredicate predicateWithFormat:@"name = %@",name];
request.predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@",name];
//执行对象管理上下文的查询方法
NSArray *array = [self.context executeFetchRequest:request error:nil];
return array;
}
-(void)onClickDeleteAction
{
// NSArray *arr = [self searchMessage:@"HZhenF"];
NSArray *arr = [self searchMessage:@"Feng"];
for (Person *p in arr) {
if (p.age == 21 || p.age == 10) {
[self removeMesage:p];
}
}
}
//删除数据
-(void)removeMesage:(Person *)person
{
[self.context deleteObject:person];
NSError *error;
if ([self.context save:&error]) {
NSLog(@"删除成功!");
}
else
{
NSLog(@"删除过程发成错误,错误信息:%@",error.localizedDescription);
}
}
-(void)onClickModifyAction
{
NSArray *arr = [self searchMessage:@"HZhenF"];
for (Person *p in arr) {
if ([p.name isEqualToString: @"HZhenF"]) {
[self modifyMessage:p];
}
}
}
//修改数据
-(void)modifyMessage:(Person *)person
{
person.name = @"Feng";
person.age = 10;
NSError *error;
if ([self.context save:&error]) {
NSLog(@"修改成功");
}
else
{
NSLog(@"修改过程发生错误,错误信息:%@",error.localizedDescription);
}
}
@end
//
// Person.h
// CoreData
//
// Created by HZhenF on 2017/5/31.
// Copyright © 2017年 Huangzhengfeng. All rights reserved.
//
#import <CoreData/CoreData.h>
@interface Person : NSManagedObject
@property(nonatomic,retain) NSString *name;
@property(nonatomic,assign) int16_t age;
@end
//
// Person.m
// CoreData
//
// Created by HZhenF on 2017/5/31.
// Copyright © 2017年 Huangzhengfeng. All rights reserved.
//
#import "Person.h"
@implementation Person
@dynamic name;
@dynamic age;
@end