为了方便以后使用。很有必要对实现细节进行一些封装。最后工程目录如下图:
具体实现细节在(二)中已经详细介绍,在此不再多说。
新建一个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;
@end
Author.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;
@end
Book.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;
@end
Book.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
}
#endif
ORMByCoreData.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的 记录(实体类对象)都被删除。