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

2014-11-24 02:33:32 · 作者: · 浏览: 8
存到持久化文件中。本例中持久化文件为 xml 文件。修改 main() 中代码如下:


int main (int argc, const char * argv[])
{
NSLog(@" === Core Data Tutorial ===");

// Enable GC
//
objc_startCollectorThread();

NSError *error = nil;

NSManagedObjectModel *moModel = managedObjectModel();
NSLog(@"The managed object model is defined as follows:\n%@", moModel);

if (applicationLogDirectory() == nil) {
exit(1);
}

NSManagedObjectContext *moContext = managedObjectContext();

// Create an Instance of the Run Entity
//
NSEntityDescription *runEntity = [[moModel entitiesByName] objectForKey:@"Run"];
Run *run = [[Run alloc] initWithEntity:runEntity insertIntoManagedObjectContext:moContext];
NSProcessInfo *processInfo = [NSProcessInfo processInfo];
run.processID = [processInfo processIdentifier];

if (![moContext save: &error]) {
NSLog(@"Error while saving\n%@", ([error localizedDescription] != nil) [error localizedDescription] : @"Unknown Error");
exit(1);
}

// Fetching Run Objects
//
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:runEntity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

error = nil;
NSArray *array = [moContext executeFetchRequest:request error:&error];
if ((error != nil) || (array == nil))
{
NSLog(@"Error while fetching\n%@", ([error localizedDescription] != nil) [error localizedDescription] : @"Unknown Error");
exit(1);
}

// Display the Results
//
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterMediumStyle];

NSLog(@"%@ run history:", [processInfo processName]);

for (run in array)
{
NSLog(@"On %@ as process ID %ld", [formatter stringForObjectValue:run.date], run.processID);
}

return 0;
}

在上面的代码中:
1)我们先获得全局的 NSManagedObjectModel 和 NSManagedObjectContext 对象:moModel 和 moContext;
2)并创建一个Run Entity,设置其 Property processID 为当前进程的 ID;
3)将该数据对象保存到持久化文件中:[moContext save: &error]。我们无需与 PersistentStoreCoordinator 打交道,只需要给 ManagedObjectContext 发送 save 消息即可,NSManagedObjectContext 会透明地在后面处理对持久化数据文件的读写;
4)然后我们创建一个 FetchRequest 来查询持久化数据文件中保存的数据记录,并将结果按照日期升序排列。查询操作也是由 ManagedObjectContext 来处理的:[moContextexecuteFetchRequest:request error:&error];
5)将查询结果打印输出;

最后,不要忘记导入相关头文件:


#import
#import
#include
#import "Run.h"
好!大功告成!编译运行,我们可以得到如下显示:
2011-09-03 21:42:47.556 CoreDataTutorial[992:903] CoreDataTutorial run history:
2011-09-03 21:42:47.557 CoreDataTutorial[992:903] On 2011-9-3 下午09:41:56 as process ID 940
2011-09-03 21:42:47.557 CoreDataTutorial[992:903] On 2011-9-3 下午09:42:16 as process ID 955
2011-09-03 21:42:47.558 CoreDataTutorial[992:903] On 2011-9-3 下午09:42:20 as process ID 965
2011-09-03 21:42:47.558 CoreDataTutorial[992:903] On 2011-9-3 下午09:42:24 as process ID 978
2011-09-03 21:42:47.559 CoreDataTutorial[992:903] On 2011-9-3 下午09:42:47 as process ID 992


通过这个例子,我们可以更好理解 Core Data 的运作机制。在 Core Data 中我们最常用的就是 ManagedObjectContext,它几乎参与对数据对象的所有操作,包括对 undo/redo 的支持;而 Entity 对应的运行时类为 ManagedObject,我们可以理解为抽象数据结构 Entity 在内存中由 ManagedObject 来体现,而 Perp