CoreData基本教程
第一,工程中引入CoreData步骤
1.添加CoreData Framework框架
2.创建Data Model(数据模型)New File -> Core Data -> Data Model
3.添加实体表和属性
Data Model -> Add Entity ->Add Attributes添加字段属性
4.创建实体对象类
方法1:选中Entity:Xcode的菜单Editor -> Create NSManagedObject SubClass…
这样可以自动生成与实体表相关连的实体类.h.m.
选择实体表 查看属性,名称和关联类名应该都已经是自动关联成功的了。
方法2:如果手动创建实体类.h.m文件,那么要手动实现与实体表的关联,否则实体表默认关联NSManagedObject,这样就会造成错误。
PS:个人项目中曾出现过类似的错误,生成实体之后实体调用它的实例方法会崩溃,实体不能识别它的实体方法。
5.编写coreData代码
首先说明,这部分编写的代码是为了引入CoreData到工程中,可以新建一个包含CoreData的空白工程,然后完全Copy其AppDegate中的引入CoreData方法即可。
代码部分:
<1>AppDelegate中引入头文件
#import <CoreData/CoreData.h>
@property (readonly,retain,nonatomic)NSManagedObjectContext *managedObjectContext;
@property (readonly,retain,nonatomic)NSManagedObjectModel *managedObjectModel;
@property (readonly,retain,nonatomic)NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
<3>AppDelegate.m中实现CoreData方法#pragma mark -
#pragma mark CoreData Methods
- (void)saveContext
{
NSError *error =nil;
NSManagedObjectContext *managedObjectContext =self.managedObjectContext;
if (managedObjectContext !=nil) {
if ([managedObjectContexthasChanges] && ![managedObjectContextsave:&error]) {
NSLog(@"Unresolved error %@, %@", error, [erroruserInfo]);
abort();
}
}
}
#pragma mark - Core Data stack
// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext !=nil) {
return_managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [selfpersistentStoreCoordinator];
if (coordinator !=nil) {
_managedObjectContext = [[NSManagedObjectContextalloc]init];
[_managedObjectContextsetPersistentStoreCoordinator:coordinator];
}
return_managedObjectContext;
}
// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel !=nil) {
return_managedObjectModel;
}
NSURL *modelURL = [[NSBundlemainBundle]URLForResource:@"XSTestModel"withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModelalloc]initWithContentsOfURL:modelURL];
return_managedObjectModel;
}
// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator !=nil) {
return_persistentStoreCoordinator;
}
NSURL *storeURL = [[selfapplicationDocumentsDirectory]URLByAppendingPathComponent:@"XSTestModel.sqlite"];//数据库的名字
NSError *error =nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:[selfmanagedObjectModel]];
if (![_persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storeURLoptions:nilerror:&error]) {
NSLog(@"Unresolved error %@, %@", error, [erroruserInfo]);
abort();
}
return_persistentStoreCoordinator;
}
#pragma mark - Application's Documents directory
// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManagerdefaultManager]URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask]lastObject];
}
参考文章:
http://hi.baidu.com/excalibur/item/ba72fb0f73c9f1c32f4c6b36
第二.CoreData的增删查
<1>新建实体
- (void)newEntity{
// 创建TestData 被管理对象实例
TestData *testData = (TestData *)[NSEntityDescriptioninsertNewObjectForEntityForName:@"TestData"
inManagedObjectContext:_managedObjectContext];
//属性赋值
testData.creatTime = [NSDatedate];
// 保存数据,持久化存储 SQLite数据库
NSError *error =nil;
if ([_managedObjectContextsave:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
- (void)deleteEntity:(NSManagedObject *)aEntity
{
// 删除实体
[_managedObjectContextdeleteObject:aEntity];
// 保存数据,持久化存储
NSError *error =nil;
if (![_managedObjectContextsave:&error]) {
//handle error
}
}
<3>查询实体
- (NSArray *)getEntity
{
// NSFetchRequest 对象用来检索数据
NSFetchRequest *request = [[NSFetchRequestalloc]init];
// 根据指定Entity名称和被管理对象上下文,创建NSEntityDescription对象,
NSEntityDescription *myEntityQuery = [NSEntityDescription
entityForName:@"TestData"
inManagedObjectContext:_managedObjectContext];
// 指定实体
[requestsetEntity:myEntityQuery];
//排序 按照时间排序
NSSortDescriptor *sortDescriptor = [[NSSortDescriptoralloc]initWithKey:@"creatTime"ascending:NO];
NSArray *sortDescriptors = [[NSArrayalloc]initWithObjects:sortDescriptor,nil];
[requestsetSortDescriptors:sortDescriptors];
[sortDescriptorsrelease];
[sortDescriptorrelease];
NSError *error =nil;
// 返回符合查询条件NSFetchRequest的记录数组
NSArray *personArr = [self.managedObjectContextexecuteFetchRequest:requesterror:&error];
[requestrelease];
}
第三.实体表关系及属性<1>关系名称必须首字母小写
<2>Apple建议每一个关系都创建一个反向关系(inverse)。没有反向关联的话会有一个数据库警告
<3>To-Many Relationship属性,代表着一对多的关系,一个实体可以关联多个。
<4>Delete Rule选项可以选择Cascade,实现级联删除,表示在使用Core Data删除表的一个对象时,与其关联的其他表的对象也将被一起删除。
增加字段Entity -> Add Attributes
<1>应该保证实体表中的字段与关联的实体类中字段一致,可以修改一次实体表就重新生成一次实体类,或者修改实体表同时手动修改实体类。
<2>NSManagedObject的字段属性的实现需要使用@dynamic而非@synthsize,不需要系统生成其存取方法,有数据库负责其存取。
属性的类型(type)和(propertites)
第五.其他相关
CoreData简介:
1.应用程序先创建或读取模型文件(后缀为xcdatamodeld)生成 NSManagedObjectModel 对象。Document应用程序是一般是通过 NSDocument 或其子类 NSPersistentDocument)从模型文件(后缀为 xcdatamodeld)读取。
2.然后生成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 对象,前者对用户透明地调用后者对数据文件进行读写。
3.NSPersistentStoreCoordinator 负责从数据文件(xml, sqlite,二进制文件等)中读取数据生成 Managed Object,或保存 Managed Object 写入数据文件。
4.NSManagedObjectContext 参与对数据进行各种操作的整个过程,它持有 Managed Object。我们通过它来监测 Managed Object。监测数据对象有两个作用:支持 undo/redo 以及数据绑定。这个类是最常被用到的。
5.Model类
Model类包含内容:
Entity(实体表),为NSMnanagedObject类或者其子类,抽象数据类型。
Property三种属性:Attribute(用于存储实体表的基本数据),RelationShip(存储关系),FetchedRequest查询条件);
6.ManagedObject类
ManagedObject为Entity的一条记录,每一个ManagedObject被创建时都有一个全局的NSManagedObjectID,当它别插入到ManagedObjectContext中时,可以通过ID在Context中查询到它。
ManagedOBjectContext管理者对数据对象的每一个操作。
Persistent Store Coordinator用来处理与底层硬件相关的存取操作,一般ManagedObjectContext已经完成了对它的控制和操作,我们无需关心。
FetchRequest
7.FetchRequest与谓词NSPredicate一起作用,用来在NSManagedObjectContext中查询符合条件的实体,结果以NSArray形式给出。通常会见FetchRequest保存以重复利用。