iOS-数据存储方式四之Core Data

来源:互联网 发布:网络文化市场 编辑:程序博客网 时间:2024/06/01 10:42
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

这里写图片描述

原创粉丝点击