首页 > 代码库 > CoreData简单教学(一)
CoreData简单教学(一)
1. New Empty Project -> Use CoreData
2. new CoreData Model .
file:///Users/xueyulun/Desktop/屏幕快照%202014-10-03%20下午11.31.04.png
3. 自己实现CoreDataHandle
//// ADPersonHandle.h// CoreData_deeper//// Created by 薛雨仑 on 14-10-3.// Copyright (c) 2014年 Dylan. All rights reserved.//#import <Foundation/Foundation.h>@interface ADPersonHandle : NSObject@property (nonatomic, readonly, strong) NSManagedObjectContext * managedObjectContext;@property (nonatomic, readonly, strong) NSManagedObjectModel * managedObjectModel;@property (nonatomic, readonly, strong) NSPersistentStoreCoordinator * persistenStoreCoordinator;- (NSURL *)applicationDocumentsDirectory;@end
.m
1 // 2 // ADPersonHandle.m 3 // CoreData_deeper 4 // 5 // Created by 薛雨仑 on 14-10-3. 6 // Copyright (c) 2014年 Dylan. All rights reserved. 7 // 8 9 #import "ADPersonHandle.h"10 11 @implementation ADPersonHandle12 13 @synthesize managedObjectContext = _managedObjectContext;14 @synthesize managedObjectModel = _managedObjectModel;15 @synthesize persistenStoreCoordinator = _persistenStoreCoordinator;16 17 #pragma mark - getter18 // 上下文19 - (NSManagedObjectContext *)managedObjectContext {20 if (_managedObjectContext) {21 return _managedObjectContext;22 }23 24 NSPersistentStoreCoordinator * coordinator = [self persistenStoreCoordinator];25 if (coordinator == nil) {26 _managedObjectContext = [[NSManagedObjectContext alloc] init];27 [_managedObjectContext setPersistentStoreCoordinator:coordinator];28 }29 30 return _managedObjectContext;31 }32 33 // 协调器34 - (NSPersistentStoreCoordinator *)persistenStoreCoordinator {35 if (_persistenStoreCoordinator) {36 return _persistenStoreCoordinator;37 }38 39 NSURL * storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Person.sqlite"];40 41 _persistenStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];42 [_persistenStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:nil];43 44 return _persistenStoreCoordinator;45 }46 47 // 模型48 - (NSManagedObjectModel *)managedObjectModel {49 if (_managedObjectModel) {50 return _managedObjectModel;51 }52 53 NSURL * modelURL = [[NSBundle mainBundle] URLForResource:@"Person" withExtension:@"momd"];54 _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];55 56 return _managedObjectModel;57 }58 59 #pragma mark - url60 // 获得所在目录61 - (NSURL *)applicationDocumentsDirectory {62 return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];63 }64 65 @end
这样, 最简单的框架, 创建结构
然后 我们来看一些理论的话
为何要使用Core Data
使用Core Data有很多原因,其中最简单的一条就是:它能让你为Model层写的代码的行数减少为原来的50 %到70%。 这归功于之前提到的Core Data的特性。更妙的是,对于上述特性你也既不用去测试,也不用花 功夫去优化。
Core Data拥有成熟的代码,这些代码通过单元测试来保证品质。应用Core Data的程序每天被世界上几百 万用户使用。通过了几个版本的发布,已经被高度优化。 它能利用Model层的信息和运行时的特性,而不通 过程序层的代码实现。 除了提供强大的安全支持和错误处理外,它还提供了最优的内存扩展性,可实现有竞 争力的解决方案。不使用Core Data的话,你需要花很长时间来起草自己的方案,解决各种问题,这样做效率 不高。
除了Core Data本身的优点之外,使用它还有其他的好处: 它很容易和Mac OS X系统的Tool chain集成; 利用Model设计工具可以按图形化方式轻松创建数据库的结构;你可以用Instruments的相关模板来测试Core Data的效率并debug。 在Mac OS X的桌面程序中,Core Data还和Interface Builder集成(打开Inspector可 以看到有binding的选项,这个东东iPhone上木有。。。),按照model来创建UI变的更简单了。 这些功能能 更进一步的帮助你缩短设计、开发、测试程序的周期。
Core Data 功能初窥
对于处理诸如对象生命周期管理、对象图管理等日常任务,Core Data框架提供了广泛且自动化的解决方案 。它有以下特性。
(注:对象图-Object graph的解释:在面向对象编程中,对象之间有各种关系,例如对象直接引用另外的 对象,或是通过引用链间接的引用其他对象,这些关系组成了网状的结构。我们把这些对象(和它们之间的 联系)成为对象图。 对象图可大可小,有繁有简。 只包含单个字符串对象的数组就是一个简单的代表;而包 含了application对象,引用windows, menus和相关视图对象、其他对象这样的结构就是复杂对象图的例子 ——这是在说mainwindow.xib。
有时,你可能想要把这样的对象图转化形式,让它们可以被保存到文件中,以使其他的进程或其他的机器 可以再次将保存的内容读出,重购对象。 这样的过程常被成之为“归档”(Archiving)。
有些对象图是不完整的——通常称之为局部对象图(partial object graphs)。局部对象图包含了“占位符” (Placeholder)对象,所谓”占位符“,就是一些暂时无内容的对象,它们将再后期被具体化。一个典型的例 子就是nib文件中包含的File‘s Owner对象。
1) 对于key-value coding 和key-value observing完整且自动化的支持 除了为属性整合KVC和KVO的访问方法外, Core Data还整合了适当的集合访问方法来处理多值关系。
2) 自动验证属性(property)值
Core Data中的managed object扩展了标准的KVC 验证方法,以保证单个的数值在可接受的范围之内,从而使组合的值有意义。(需校准翻译)
3) 支持跟踪修改和撤销操作
对于撤销和重做的功能,除过用基本的文本编辑外,Core Data还提供内置的管理方式。
4) 关系的维护
Core Data管理数据的变化传播,包括维护对象间关系的一致性。
5) 在内存中和界面上分组、过滤、组织数据
6) 自动支持对象存储在外部数据仓库的功能
7) 创建复杂请求 你不需要动手去写复杂的SQL语句,就可以创建复杂的数据请求。方法是在“获取请求”(fetch request)中关联NSPredicate(又看到这个东东了,之前用它做过正则)。NSPrdicate支持基本的功能、相关子查询和其他高级的 SQL特性。它还支持正确的Unicode编码(不太懂,请高人指点), 区域感知查询(据说就是根据区域、语言设置调整查询的行为)、排序和正则表达式。
8) 延迟操作
9) 合并的策略
Core Data 内置了版本跟踪和乐观锁定(optimistic locking)来支持多用户写入冲突的解决。 注:乐观锁,假定数据一般不出现冲突,所以在数据提交更新的时候,才对数据的冲突进行检测,如果冲突 了,就返回冲突信息。
10) 数据迁移
就开发工作和运行时资源来说,处理数据库架构的改变总是很复杂。Core Data的schema migration工具可以 简化应对数据库结构变化的任务, 而且在某些情况下,允许你执行高效率的数据库原地迁移工作。
11) 可选择针对程序Controller层的集成,来支持UI的显示同步
Core Data在iPhone OS之上 提供NSFetchedResultsController对象来做相关工作,在Mac OS X上,我们用 Cocoa提供的绑定(Binding)机制来完成。
// ps 今天比较晚了, 明天我们继续来分享coredata。 上边理论内容借鉴cocoaChina文章。
CoreData简单教学(一)