CoreData

原创 2016年08月30日 11:44:33

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS Coredata安全之多线程

今天去一家公司面试,被问到coredata是怎么处理
  • xiaowenwen1010
  • xiaowenwen1010
  • 2014年09月25日 00:25
  • 1651

Coredata的版本升级

在开发的后期,可能因为完善和修复功能,需要对Coredata数据库表进行修改,这样就需要对CoreData进行版本升级。 比如你修改了DB字段以后,用户在旧版本上升级为新版本时会crash. 因为升级...
  • mjx342112780
  • mjx342112780
  • 2016年08月27日 10:55
  • 4875

iOS学习之CoreData多表关联使用

坚持 成长 每日一篇,iOS学习之CoreData多表关联使用
  • u014410695
  • u014410695
  • 2015年08月29日 11:19
  • 2220

CoreData处理大量数据

随着iOS8和OSX10.10的发布,Core Data也迎来了更新。这次的更新可谓是重量级的,它使得程序员能够更加直接高效的操作数据库,在处理大量数据时速度明显提升(这在以前不知有多少程序员因为Co...
  • xiaowenwen1010
  • xiaowenwen1010
  • 2014年10月15日 11:16
  • 1552

iOS开发-CoreData的简单使用

什么是CoreData? CoreData是iOS5之后才出现的一个框架, 它提供了对象-关系映射(ORM)的功能, 即能够将OC对象转换成数据, 保存在SQLite数据库文件中, 也能够将保存在数据...
  • lc_1581835288
  • lc_1581835288
  • 2015年12月28日 15:33
  • 904

iOS 持久化存储之CoreData VS 直接SQlite

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK详解专栏 http://blog.csdn.net/column/details/huan...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年07月12日 11:03
  • 6833

CoreData版本迁移(一)

轻量级迁移 符合下面情况的数据迁移为轻量级迁移: 1.添加、删除实体 2.修改原有实体的属性(增加、删除、修改) 适用场景:在版本迭代中为了满足新需求数据库的表结构可能会发生改变,这时就需要一个新...
  • ycz19930423
  • ycz19930423
  • 2016年07月25日 00:43
  • 297

sqlite与coreData的简单比较

前些时日,面试一家公司,对方的面试考官问我对于这两个区别有什么看法。以前项目里边只顾着写,没想太多,简单的答复 coreData提供ORM(Object Relationships Mapping)解...
  • zhang7761
  • zhang7761
  • 2015年03月27日 11:33
  • 1131

OCiOS开发:手动创建CoreData数据模型

前言我们知道,在项目中当需要使用CoreData存储数据,创建工程的时候我们需要勾选Use Core Data选项,如下所示:在教学过程中,有学生这样问我,如果在项目中后期需要使用CoreData存储...
  • Hierarch_Lee
  • Hierarch_Lee
  • 2016年04月27日 22:52
  • 2826

FMDB和CoreData在多线程中的应用和区别

FMDB和CoreData在多线程中的应用FMDB在多线程中应用 如果包装的是FMDatabase类,就绝对会有问题, 因为FMDatabase实例不能在多线程环境共享,在多线程中决不能使用一个FMD...
  • qq871531334
  • qq871531334
  • 2015年12月13日 18:10
  • 1445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CoreData
举报原因:
原因补充:

(最多只允许输入30个字)