CoreData

1.简介
Core Data 是 iOS5 之后才出现的一个框架,它提供了对象-关系映射 (ORM) 的功能,即能够将 OC 对象转化成数据,保存在 SQLite 数据库文件中,也能够将保存在数据库中的数据还原成 OC 对象。在此数据操作期间,我们不需要编写任何 SQL 语句

CoreData 本质是一个ORM框架 ORM Objective-Relational Mapping 这个映射就是我们的模型文件,一般 ORM 框架都用 XML 格式来映射 实体Entity+属性数据库表,列

托管对象(entity) —既不是单纯的 内存对象,也不是数据库中的具体的数据,它介于这两个状态之间的,我们叫他游离态的数据

CoreData 不能执行 SQL 语句 取而代之,操作的是对象, FMDB SQLite 可以直接执行 SQL 语句

2.CoreData 的使用
1>直接创建项目工程文件, 勾选 Use Core Data 选项, 此时会自动生成对应的文件, 以及一些必要的代码
这里写图片描述

项目创建好之后, 我们发现多了一个 __CoreData.xcdatamodeld 文件, 以及 AppDelegate 文件中多了一些代码
这里写图片描述

接下来添加实体
这里写图片描述

生成模型文件
这里写图片描述

勾选 CoreData 文件
这里写图片描述

勾选实体
这里写图片描述

创建好之后, 会生成这些模型文件
这里写图片描述

在控制器中, 存数据和写数据的代码:

存数据:

// 为了获取 appDelegate 中的上下文属性
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:appDelegate.managedObjectContext];

person.name = @"lcn";
person.age = @(20);

// 保存数据
[appDelegate.managedObjectContext save:nil];

取数据

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

// NSFetchRequest 请求对象
NSFetchRequest *request = [[NSFetchRequest alloc] init];

// 实体
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:appDelegate.managedObjectContext];
request.entity = entity;

// 谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", @"lcn"];
request.predicate = predicate;

// 排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
request.sortDescriptors = @[sort];

NSArray *tempArr = [appDelegate.managedObjectContext executeFetchRequest:request error:nil];

[tempArr enumerateObjectsUsingBlock:^(Person *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

    NSLog(@"%@: %@", obj.name, obj.age);
}];

2>但是在真正开发中, 我们可能一开始并不能确定我们是否要使用 CoreData, 当我们在后续中想要使用 CoreData 时, 很显然我们不能重新搭建一个项目, 所以就需要我们自己来编写对应的代码

创建一个工具类, 以及实体文件
这里写图片描述

LCNCoreDataManager.h 中的代码

/**
 *  单例
 */
+ (instancetype)shareManager;

/**
 *  管理对象的上下文
 */
@property (nonatomic,strong) NSManagedObjectContext *context;

LCNCoreDataManager.m 中的代码

+ (instancetype)shareManager {

static id _instance;

static dispatch_once_t once;
dispatch_once(&once, ^{

    _instance = [[self alloc] init];

});

return _instance;
}

#pragma mark - 上下文的懒加载
- (NSManagedObjectContext *)context {
    if (!_context) {

    // 加载模型文件  momd 为简写
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"Dog" withExtension:@"momd"];

    // 创建模型文件
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];

    // 创建协调器
    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    // 创建上下文
    _context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

    // 把协调器传递给上下文
    [_context setPersistentStoreCoordinator:coordinator];

    // 数据库地址(要把文件名也拼接上)
    NSString *string = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"Dog.db"];
    NSURL *pathUrl = [NSURL URLWithString:string];

    [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:pathUrl options:nil error:nil];
    }
    return _context;
}

然后接下来的过程就和上面一样了, 注意获取上下文的时候是通过我们自己的工具类获取, 上面的是通过 AppDelegate 获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值