iOS学习笔记14(1)—Core Data简单介绍和实现
Core Data可以将模型对象保存到持久化存储中,并在需要的时候将它们取出。Core Data应用程序的持久化存储范围可以从XML文件到SQL数据库。
Core Data简化了应用程序创建和使用托管对象的方式,通过Core Data管理应用程序的数据模型,可以极大程度减少需编写的代码数量。
Core Data还具有下述特征:
将对象数据存储在SQLite数据库以获得性能优化。
提供NSFetchedResultsController类用于管理表视图的数据。即将Core Data的持久化存储显示在表视图中,并对这些数据进行管理:增、删,改。
管理undo/redo操作。
检查托管对象的属性值是否正确。
Core Data的核心概念是托管对象。托管对象是由CoreData管理的简单模型对象,必须是NSManagedObject类或其子类的实例。托管对象模型包含一些应用程序托管对象(也称为实体)的描述。每个描述负责指定一个实体的属性、它与其它实体的关系、以及像实体名称和实体表示类这样的元数据。
基本实现大致需要如下步骤
1、创建和编辑模型文件
XCode-File菜-New-File-iOS-CoreData-DataModel-next-输入名称-保存。
2、生成CoreData的.h和.m文件
XCode-File菜-New-File-iOS-CoreData- NSManagedObject subclass –next-选中上面步骤1中的模型文件-Create。
这个步骤并不是必须的,但使用它们会比较方便,因为借助它们可以在应用中使用点表示法,这样就不必使用valueForKey:调用来检索托管对象属性了。
3、指定存储数据文件
// 指定存储数据文件,url指向希望用于存储模型数据的文件。
NSURL *url = [NSURLfileURLWithPath: [NSHomeDirectory() stringByAppendingString:@"/Documents/CoreDataTest.sqlite"]];
4、创建托管对象模型
// 创建托管对象模型
NSManagedObjectModel*managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
5、创建持久化存储协调器,并使用SQLite数据库做持久化存储
// 创建持久化存储协调器,并使用SQLite数据库做持久化存储
NSPersistentStoreCoordinator*persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:managedObjectModel];
NSError *error;
if(![persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType
configuration:nil
URL: url
options:nil
error:&error]){
NSLog(@"Error: %@", [errorlocalizedDescription]);
}
6、创建托管对象上下文
// 创建托管对象上下文
NSManagedObjectContext *ct =[[NSManagedObjectContext alloc] init];
self.context = ct;
[self.contextsetPersistentStoreCoordinator: persistentStoreCoordinator];
[ct release];
7、创建实体描述对象
// 创建实体描述对象
Person *person1 = (Person*)[NSEntityDescription insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:self.context];
person1.name = @"Joe";
person1.age = 29;
8、创建托管对象
NSManagedObject*managedObject = [[NSManagedObjectalloc] initWithEntity: entityDescription insertIntoManagedObjectContext: managedObjectContext];
9、保存
NSError *error;
if (![self.context save:&error]){
NSLog(@"Error: %@", [errorlocalizedDescription]);
}
10、创建获取数据请求
// 创建获取数据请求
NSFetchRequest *fetchRequest= [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Person"
inManagedObjectContext:self.context]];
11、获取持久化存储中的数据,并对数据进行缓存
// 获取持久化存储中的数据,并对数据进行缓存
NSError *error;
self.results =[[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest
managedObjectContext:self.context
sectionNameKeyPath:nil
cacheName:@"Root"];
self.results.delegate =self;
if (![[self results]performFetch:&error]){
NSLog(@"Error: %@", [errorlocalizedDescription]);
}
12、数据显示
// 数据显示
for (Person *personinself.results.fetchedObjects){
NSLog(@"%@ : %d", person.name, person.age);
}
详细的了解Core Data请参考:
http://www.cocoachina.com/iphonedev/sdk/2010/1126/2397.html
或:
http://blog.youkuaiyun.com/jjunjoe/article/details/8772174
归档为sqlite的详细工程源码地址:
http://download.youkuaiyun.com/detail/jjunjoe/5054969
归档为xml的详细工程源码地址:
http://download.youkuaiyun.com/detail/jjunjoe/5056090