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

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

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值