首页 > 代码库 > 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简单教学(一)