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 获取