深入浅出Cocoa之Core Data(2)- 代码示例(二)

2014-11-24 02:33:32 · 作者: · 浏览: 6
ctContext alloc] init];

// Create a persistent store coordinator, then set the coordinator for the context.
//
NSManagedObjectModel *moModel = managedObjectModel();
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:moModel];
[moContext setPersistentStoreCoordinator: coordinator];

// Create a new persistent store of the appropriate type.
//
NSString *STORE_TYPE = NSXMLStoreType;
NSString *STORE_FILENAME = @"CoreDataTutorial.xml";

NSError *error = nil;
NSURL *url = [applicationLogDirectory() URLByAppendingPathComponent:STORE_FILENAME];

NSPersistentStore *newStore = [coordinator addPersistentStoreWithType:STORE_TYPE
configuration:nil
URL:url
options:nil
error:&error];

if (newStore == nil) {
NSLog(@"Store Configuration Failure\n%@", ([error localizedDescription] != nil) [error localizedDescription] : @"Unknown Error");
}

return moContext;
}

在上面的代码中:
1)我们创建了一个全局 ManagedObjectContext 对象 moContext;
2)并在设置其 persistent store coordinator,存储类型为 xml,保存文件名为:CoreDataTutorial.xml,并将其放到前面定义的存储路径下。

好,至此万事具备,只欠 ManagedObject 了!下面我们就来定义这个数据对象类。向工程添加 Core Data->NSManagedObject subclass 的类,名为 Run (模型中 Entity 定义的类名) 。

Run.h


//
// Run.h
// CoreDataTutorial
//
// Created by kesalin on 8/29/11.
// Copyright 2011 kesalin@gmail.com. All rights reserved.
//

#import

@interface Run : NSManagedObject
{
NSInteger processID;
}

@property (retain) NSDate *date;
@property (retain) NSDate *primitiveDate;
@property NSInteger processID;

@end

Run.m
//
// Run.m
// CoreDataTutorial
//
// Created by kesalin on 8/29/11.
// Copyright 2011 kesalin@gmail.com. All rights reserved.
//

#import "Run.h"

@implementation Run

@dynamic date;
@dynamic primitiveDate;

- (void) awakeFromInsert
{
[super awakeFromInsert];

self.primitiveDate = [NSDate date];
}

#pragma mark -
#pragma mark Getter and setter

- (NSInteger)processID
{
[self willAccessValueForKey:@"processID"];
NSInteger pid = processID;
[self didAccessValueForKey:@"processID"];
return pid;
}

- (void)setProcessID:(NSInteger)newProcessID
{
[self willChangeva lueForKey:@"processID"];
processID = newProcessID;
[self didChangeva lueForKey:@"processID"];
}

// Implement a setNilValueForKey: method. If the key is “processID” then set processID to 0.
//
- (void)setNilValueForKey:(NSString *)key {

if ([key isEqualToString:@"processID"]) {
self.processID = 0;
}
else {
[super setNilValueForKey:key];
}
}

@end

注意:
1)这个类中的 date 和 primitiveDate 的访问属性为 @dynamic,这表明在运行期会动态生成对应的 setter 和 getter;
2)在这里我们演示了如何正确地手动实现 processID 的 setter 和 getter:为了让 ManagedObjecContext 能够检测 processID的变化,以及自动支持 undo/redo,我们需要在访问和更改数据对象时告之系统,will/didAccessValueForKey 以及 will/didChangeva lueForKey 就是起这个作用的。
3)当我们设置 nil 给数据对象 processID 时,我们可以在 setNilValueForKey 捕获这个情况,并将 processID 置 0;
4)当数据对象被插入到 ManagedObjectContext 时,我们在 awakeFromInsert 将时间设置为当前时间。

三,创建或读取数据对象,设置其值,保存
好,至此真正的万事具备,我们可以创建或从持久化文件中读取数据对象,设置其值,并将其保