为了方便以后使用。很有必要对实现细节进行一些封装。最后工程目录如下图:
具体实现细节在(二)中已经详细介绍,在此不再多说。
新建一个Author作者实体和一个Book实体。一个Book只有一个作者对象,一个作者有多个Book对象。即设置一对一和一对多的关系,详见如下图:
新建文件 点击NSManagedObject SubClass, 让实体生成对应的模型类。如下图:
完成后,自动生成Author类和Book类,如下所示:
Author.h
// // Author.h // 关系对象映射ORM之CoreData(二) // // Created by apple on 15/10/1. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @class Book; @interface Author : NSManagedObject @property (nonatomic, retain) NSString * authorName; @property (nonatomic, retain) NSSet *books; @end @interface Author (CoreDataGeneratedAccessors) - (void)addBooksObject:(Book *)value; - (void)removeBooksObject:(Book *)value; - (void)addBooks:(NSSet *)values; - (void)removeBooks:(NSSet *)values; @endAuthor.m
// // Author.m // 关系对象映射ORM之CoreData(二) // // Created by apple on 15/10/1. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import "Author.h" #import "Book.h" @implementation Author @dynamic authorName; @dynamic books; @endBook.h
// // Book.h // 关系对象映射ORM之CoreData(二) // // Created by apple on 15/10/1. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @class NSManagedObject; @interface Book : NSManagedObject @property (nonatomic, retain) NSString * bookName; @property (nonatomic, retain) NSManagedObject *author; @endBook.m
// // Book.m // 关系对象映射ORM之CoreData(二) // // Created by apple on 15/10/1. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import "Book.h" #import <CoreData/NSManagedObject.h> @implementation Book @dynamic bookName; @dynamic author; @end新建一个类,删除里面的类的声明和实现,主要是为了添加方法使用。
ORMByCoreData.h
// // ORMByCoreData.h // 关系对象映射ORM之CoreData(二) // // Created by apple on 15/10/1. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> // 将此类定义为单例类 #ifdef __cplusplus extern "c" { #endif NSManagedObjectContext * getContext(); // 返回上下文 BOOL saveToDB(NSManagedObjectContext *context); // 保存操作 // 查询操作 NSArray * executeQuary(NSManagedObjectContext *context, NSString *entityName,NSString *predicate,NSString *sortKey,BOOL isAscend); // 删除操作——即将根据制定条件查询出来的数据进行删除 BOOL deleteByQuery(NSManagedObjectContext *context, NSString *entityName,NSString *predicate); #ifdef __cplusplus } #endifORMByCoreData.m
// // ORMByCoreData.m // 关系对象映射ORM之CoreData(二) // // Created by apple on 15/10/1. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import "ORMByCoreData.h" // 创建上下文 NSManagedObjectContext * getContext() { static NSManagedObjectContext *managedObjectContext = nil; if (managedObjectContext==nil) { // 打开模型文件,参数为nil则打开包中所有模型文件合并成一个 NSManagedObjectModel *model= [NSManagedObjectModel mergedModelFromBundles:nil]; // 创建持久化存储助理类的对象 并用model模型进行初始化 NSPersistentStoreCoordinator *storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; // 创建数据库保存路径 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; NSString *dbPath = [path stringByAppendingPathComponent:@"MyDataBase.sqlite"]; NSURL *url = [NSURL fileURLWithPath:dbPath]; // 利用已被初始化的持久化存储助理类对象根据Model模型在指定的路径创建数据库 NSError *error = nil; [storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]; if (error) { NSLog(@"数据库打开失败!错误: %@", [error localizedDescription]); } else{ managedObjectContext = [[NSManagedObjectContext alloc] init]; managedObjectContext.persistentStoreCoordinator = storeCoordinator; NSLog(@"数据库打开成功!"); } } return managedObjectContext; } BOOL saveToDB(NSManagedObjectContext *context) { BOOL isSave; NSError *error=nil; [context save:&error]; if (error) { NSLog(@"保存数据失败: %@", [error localizedDescription]); isSave = NO; } else{ NSLog(@"保存数据成功"); isSave = YES; } return isSave; } // 根据条件返回查询数据 NSArray * executeQuary(NSManagedObjectContext *context, NSString *entityName,NSString *predicate,NSString *sortKey,BOOL isAscend) { NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; // 设置谓词过滤 if (predicate) { NSPredicate *predic = [NSPredicate predicateWithFormat:predicate]; request.predicate = predic; } // 设置排序方式 if (sortKey) { NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:sortKey ascending:isAscend]; request.sortDescriptors = [NSArray arrayWithObject:sort]; } NSError *error = nil; NSArray *objs = [context executeFetchRequest:request error:&error]; if (error) { NSLog(@"查询错误:%@",[error localizedDescription]); objs =nil; }else{ NSLog(@"查询成功"); } return objs; } /*根据指定条件进行删除*/ BOOL deleteByQuery(NSManagedObjectContext *context, NSString *entityName,NSString *predicate) { BOOL isDelete; NSArray *querry = executeQuary(context, entityName, predicate, nil, YES); if (querry) { for(NSManagedObject *objc in querry) { [context deleteObject:objc]; } } if (saveToDB(context)) { isDelete = YES; } return isDelete; }新建pch文件PrefixHeader.pch,(为了避免繁杂的文件导入操作)并进行设置。设置完成后,编辑内容如下:
// // PrefixHeader.pch // 关系对象映射ORM之CoreData(二) // // Created by apple on 15/10/1. // Copyright (c) 2015年 LiuXun. All rights reserved. // #ifndef ______ORM_CoreData____PrefixHeader_pch #define ______ORM_CoreData____PrefixHeader_pch #import "ORMByCoreData.h" #import <CoreData/CoreData.h> #import "Author.h" #import "Book.h" #endif在控制器的.m文件中调用如下:
// // ViewController.m // 关系对象映射ORM之CoreData(二) // // Created by apple on 15/10/1. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"%@",NSHomeDirectory()); // context都是同一个 NSManagedObjectContext * context = getContext(); // NSManagedObjectContext * context2 = getContext(); // NSManagedObjectContext * context3 = getContext(); // 相当于插入记录 Book *book1 = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context]; book1.bookName = @"老人a与海"; Book *book2 = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context]; book2.bookName = @"朝花a夕拾"; Book *book3 = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context]; book3.bookName = @"上下bb五千年"; Author *author = [NSEntityDescription insertNewObjectForEntityForName:@"Author" inManagedObjectContext:context]; author.authorName = @"海明威"; // [author addBooks:[NSSet setWithObjects:book1,book2,book3, nil]]; [author addBooksObject:book1]; [author addBooksObject:book2]; [author addBooksObject:book3]; saveToDB(context); // 查询符合条件的数据 NSArray *queryArray = executeQuary(context, @"Book", @"bookName LIKE '*a*' ", @"bookName", YES); if (queryArray) { for(NSManagedObject *obj in queryArray) { NSLog(@"name=%@ ",[obj valueForKey:@"bookName"]); } } // 修改指定条件的数据 if (queryArray) { for (NSManagedObject *obj in queryArray){ [obj setValue:author forKey:@"author"]; } } // 切记:修改后必须要保存才能写入到持久化存储库——数据库 saveToDB(context); // 删除指定条件的数据 BOOL isdel = deleteByQuery(context, @"Book", @"bookName LIKE '*a*'"); if (isdel) { NSLog(@"delete success"); } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end在删除数据操作之前打开数据库如下:
Book实体对应的表格如下:
发现修改后的凡是书名中带有字母a的对象 其作者都不为NULL
执行删除操作后再重新打开如下:
发现凡是书名中带有字母a的 记录(实体类对象)都被删除。