CoreData基本操作封装

本文仅对CoreData的增、删、该、查操作做简单封装。之所以说是简单封装,是因为本次封装不涉及多线程。
思路:创建一个单例类CoreDataManager--->添加属性:NSManagedObjectModel、NSPersistentStoreCoordinator、
NSManagedObjectContext--->重写该类初始化方法:在方法中初始化NSManagedObjectContext对象--->重写set方法
(NSPersistentStoreCoordinator、NSManagedObjectContext)--->封装增、删、该、查操作。

1.准备工作

.m文件中导入“#import <CoreData/CoreData.h>”并添加属性:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

2.创建单例类

static CoreDataManager*__manager;
//创建单例类
+(instancetype)shareManager{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        __manager=[[self alloc]init];
    });
    
    return __manager;
}

3.重写init方法

/*
 *1、初始化方法,初始化 NSManagedObjectContext
 *2、NSManagedObjectContext:被管理者对象上下文 相当于一个临时数据库 我们存储或者查询都是通过这个对象来的
 *3、NSPersistentStoreCoordinator:文件存储助理,相当于数据库的链接器,它是CoreData的核心 负责链接所有的模块, 包括真实的存储文件;
 */
-(id)init{
    if (self=[super init]) {
        
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (!coordinator) {
            return nil;
        }
        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        
    }
    
    return self;
}

4.set方法:persistentStoreCoordinator

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    
    //CoreData是建立在SQLite之上的,数据库名称需与.cdatamodel文件同名
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Model.sqlite"];
    
    NSError *error = nil;
    NSString *failureReason = @"There was an error creating or loading the application's saved data.";
    // 加载sqlite数据库文件
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
        dict[NSLocalizedFailureReasonErrorKey] = failureReason;
        dict[NSUnderlyingErrorKey] = error;
        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    
    return _persistentStoreCoordinator;
}

//获取沙盒Documents目录中文件的URL
- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

5.set方法:managedObjectModel

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    // xcdataModeld文件编译后为momd文件,从资源文件加载NSManagedObjectModel
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

6.保存文件

//添加、删除操作执行后,需要调用该方法保存文件
- (void)saveContext {
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        NSError *error = nil;
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

7.添加数据

//第一种插入操作(根据字典传递数据)
-(BOOL)insertObjectWithEntity:(NSString*)entity parameter:(NSDictionary*)param{

    NSManagedObject*object=[NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:_managedObjectContext];

    for (NSString*key in param.allKeys) {
        [object setValue:param[key] forKey:key];
    }
    
    return YES;
}

//第二种插入操作(利用Block)
-(BOOL)insertObjectWithEntity:(NSString*)entity completion:(XHInsertBlock)completionHandle{

    NSManagedObject*object=[NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:_managedObjectContext];
    
    completionHandle(object);
    
    if (object) {
        return YES;
    }else{
        return NO;
    }
}

举例:

//第一种:
 NSDictionary*dic=@{@"name":@"Kevin"};
[_manager insertObjectWithEntity:@"People" parameter:dic];
[_manager saveContext];
            
//第二种:
[_manager insertObjectWithEntity:@"People" completion:^(NSManagedObject *object) {               
    [object setValue:@"Tom" forKey:@"name"];
}];
[_manager saveContext];

8.查询数据

-(NSArray*)queryWithEntity:(NSString*)entity predicate:(NSPredicate*)predicate sortKey:(NSString*)key ascending:(BOOL)isAscending{
    //创建取回数据请求
    NSFetchRequest*request=[[NSFetchRequest alloc]init];
    //设置检索的实体描述
    NSEntityDescription*entityDes=[NSEntityDescription entityForName:entity inManagedObjectContext:_managedObjectContext];
    [request setEntity:entityDes];
    //谓词,筛选数据
    request.predicate=predicate;
    //指定对检索结果的排序方式
     if ( key ){
         //之所以添加判断,是因为如果key为nil,NSSortDescriptor则无法初始化,程序会奔溃
         NSSortDescriptor*sortDestor=[[NSSortDescriptor alloc]initWithKey:key ascending:isAscending];
         [request setSortDescriptors:@[sortDestor]];
    }
    NSError*error=nil;
    //执行请求,返回数组
    NSArray*fetchedResult=[_managedObjectContext executeFetchRequest:request error:&error];
    if (!fetchedResult) {
        NSLog(@"error:%@ ,%@",error,[error userInfo]);
    }
    
    return fetchedResult;
}

举例:

//查询sex=@"Man"的people对象,按照age的升序排列
NSPredicate*predicate=[NSPredicate predicateWithFormat:@"sex=%@",@"Man"];
dataArray=[_manager queryWithEntity:@"People" predicate:predicate sortKey:@"age" ascending:YES];

9.修改数据

修改数据建立在查询数据的基础上。查询数据的方法返回的是存储数据的内存地址的指针变量。因此,可以通过指针变量对其指向的内存修改数据。
举例:

People*people=(People*)dataArray[0];
people.name=@"Tom";
people.age=18;

10.删除数据

-(BOOL)deleteObject:(NSManagedObject*)object{
    if (object && [object isKindOfClass:[NSManagedObject class]]) {
        [_managedObjectContext deleteObject:object];
        return YES;
    }
    return NO;
}

举例:

People*people=(People*)dataArray[0];
[_manager deleteObject:people];
[_manager saveContext];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容