IOS对象关系映射(ORM)之coreData框架的学习——(三)对使用步骤进行方法封装

  为了方便以后使用。很有必要对实现细节进行一些封装。最后工程目录如下图:


具体实现细节在(二)中已经详细介绍,在此不再多说。

新建一个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的 记录(实体类对象)都被删除。

你可能感兴趣的:(IOS对象关系映射(ORM)之coreData框架的学习——(三)对使用步骤进行方法封装)