关闭

CoreData

标签: 数据库CoreData
56人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4205次
    • 积分:155
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条