CoreData教学完整版(封装我们自己的CoreData工具)_Dylan

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

1. 今天的课程、 大家在学习之后肯定会有另一番想法、

至少、 你们会收藏我的博客吧、嘿嘿、 新开的人气可不怎么高

2. 好、 废话不多说、 直接切入正题、 网上讲coreData的有好多、 但大多数不怎么细致、 也不会完整的敲代码、

所以、 今天上午我自己简单的封装一下coreData供自己使用。 大家可以借鉴一下。 又不足之处还望指出。

3. 开始编码:

1. 导入 coreData.FrameWork 我们今天封装的东西、 不实用系统自带的coreData、 而是导入库自己去写。 加深印象

思想: 单例 + 中间层 (中间层继承于NSManagedObject 方便我们操作、 也有住于在业务量大的时候优化代码)

总共4个文件 我们开始编码:

1、单例 ADCoreData.h

1//2//ADCoreData.h3//CoreData_CE4//5//Created by Dylan on 14-10-11.6//Copyright (c) 2014年 Dylan. All rights reserved.7//89/*!10* @Author Dylan.11*12* Please add CoreData.FrameWork13*/1415#import<Foundation/Foundation.h>16#import<CoreData/CoreData.h>1718@interfaceADCoreData : NSObject1920/*!21* @Author Dylan.22*23* context24*/25@PRoperty (nonatomic, strong,readonly) NSManagedObjectContext *manageContext;2627+ (instancetype)shareInstanceWithStoreName: (NSString *)storeName;2829/*!30* @Author Dylan.31*32* Methods33*/3435- (NSMutableArray *)findByModel: (id)model;36- (NSMutableArray *)findByModel: (id)model37predicateString: (NSString *)predicateString;38/*!39* Update40*/41- (BOOL)create: (id)model;4243- (BOOL)remove: (id)model;44- (BOOL)remove: (id)model45predicateString: (NSString *)predicateString;46- (BOOL)modify: (id)model47predicateString: (NSString *)predicateString;4849@end

ADCoreData.m

1//2//ADCoreData.m3//CoreData_CE4//5//Created by Dylan on 14-10-11.6//Copyright (c) 2014年 Dylan. All rights reserved.7//89#import"ADCoreData.h"10#import"ADCoreDataManager.h"11#import<objc/runtime.h>1213#defineCLASS_NAME(PRAM) NSStringFromClass([PRAM class])1415@interfaceADCoreData ()1617@property (nonatomic, strong) NSManagedObjectModel *managedobjectModel;18@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;1920/*!21* @Author Dylan.22*23* storeName24*/25@property (nonatomic, strong) NSString *storeName;2627- (NSURL *)applicationDomainUrl;2829@end3031staticADCoreData *coreData;3233@implementationADCoreData3435+ (instancetype)shareInstanceWithStoreName:(NSString *)storeName {36staticdispatch_once_t onceToken;37dispatch_once(&onceToken, ^{38coreData =[[self alloc] init];39coreData.storeName =storeName;40});4142returncoreData;43}4445/*!46* @Author Dylan.47*48* synthesize49*/50@synthesizemanageContext =_manageContext;51@synthesizemanagedobjectModel =_managedobjectModel;52@synthesizepersistentStoreCoordinator =_persistentStoreCoordinator;5354#pragmamark -55#pragmamark - GET56- (NSManagedObjectContext *)manageContext {5758if(_manageContext) {59return_manageContext;60}6162NSPersistentStoreCoordinator * coordinator =[self persistentStoreCoordinator];63if(coordinator !=nil) {64_manageContext =[[NSManagedObjectContext alloc] init];65[_manageContext setPersistentStoreCoordinator:coordinator];66}67return_manageContext;68}6970- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {7172if(_persistentStoreCoordinator) {73return_persistentStoreCoordinator;74}7576NSURL * storeUrl = [[self applicationDomainUrl] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", _storeName]];77_persistentStoreCoordinator =[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedobjectModel];78[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:nil];79return_persistentStoreCoordinator;80}8182- (NSManagedObjectModel *)managedobjectModel {8384if(_managedobjectModel) {85return_managedobjectModel;86}8788NSURL * modelUrl = [[NSBundle mainBundle] URLForResource:_storeName withExtension:@"momd"];89_managedobjectModel =[[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];90return_managedobjectModel;91}9293#pragmamark - Methods94- (NSMutableArray *)findByModel: (id)model {9596NSError * error =nil;97NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:nil] error:&error];98NSMutableArray * resultArray =[NSMutableArray array];99100for(ADCoreDataManager * managerinlistArray) {101102for(NSString * propertyNamein[self ClassAttributes:model]) {103[model setValue:[manager valueForKey:propertyName] forKey:propertyName];104}105[resultArray addObject:model];106}107returnresultArray;108}109110- (NSMutableArray *)findByModel: (id)model111predicateString: (NSString *)predicateString; {112113NSError * error =nil;114NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:predicateString] error:&error];115NSMutableArray * resultArray =[NSMutableArray array];116117if(listArray.count >=1) {118for(ADCoreDataManager * managerinlistArray) {119120for(NSString * propertyNamein[self ClassAttributes:model]) {121[model setValue:[manager valueForKey:propertyName] forKey:propertyName];122}123[resultArray addObject:model];124}125}126returnresultArray;127}128129#pragmamark update130- (BOOL)create: (id)model {131ADCoreDataManager * manager =[NSEntityDescription insertNewObjectForEntityForName:CLASS_NAME(model) inManagedObjectContext:_manageContext];132133for(NSString * propertyNamein[self ClassAttributes:model]) {134[manager setValue:[model valueForKey:propertyName] forKey:propertyName];135}136BOOL result =[self saveContext];137returnresult;138}139140- (BOOL)remove: (id)model {141142NSError * error =nil;143NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:nil] error:&error];144if(listArray.count >0) {145for(ADCoreDataManager * managerinlistArray) {146[_manageContext deleteObject:manager];147}148}149return[self saveContext];150}151152- (BOOL)remove: (id)model153predicateString: (NSString *)predicateString {154155NSError * error =nil;156NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:predicateString] error:&error];157158if(listArray.count >0) {159for(ADCoreDataManager * managerinlistArray) {160[_manageContext deleteObject:manager];161}162}163return[self saveContext];164}165166- (BOOL)modify: (id)model167predicateString: (NSString *)predicateString {168169NSError * error =nil;170NSArray * listArray = [_manageContext executeFetchRequest:[self bindRequest:CLASS_NAME(model) predicate:predicateString] error:&error];171172if(listArray.count >0) {173174for(ADCoreDataManager * managerinlistArray) {175for(NSString * propertyNamein[self ClassAttributes:model]) {176[manager setValue:[model valueForKey:propertyName] forKey:propertyName];177}178}179}180return[self saveContext];181}182183#pragmamark - collect184- (NSFetchRequest *)bindRequest: (NSString *)className185predicate: (NSString *)predicateString {186NSFetchRequest * request =[[NSFetchRequest alloc] init];187[request setEntity:[NSEntityDescription entityForName:className inManagedObjectContext:_manageContext]];188189if(predicateString !=nil) {190NSPredicate * predicate =[NSPredicate predicateWithFormat:predicateString];191NSLog(@"%@", predicate);192NSLog(@"%@", predicateString);193[request setPredicate:predicate];194}195returnrequest;196}197198199#pragmamark - save200-(BOOL)saveContext {201202NSManagedObjectContext * context =[self manageContext];203if(context !=nil) {204205NSError * error =nil;206if([context hasChanges] && ![context save:&error]) {207NSLog(@"%@", [error userInfo]);208abort();209returnNO;210}211}212213returnYES;214}215216217- (NSURL *)applicationDomainUrl {218return[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];219}220221#pragmamark - allAttributes222- (NSMutableArray *) ClassAttributes: (id)classModel {223224NSMutableArray * array =[NSMutableArray array];225NSString *className = NSStringFromClass([classModelclass]);226constchar* cClassName =[className UTF8String];227228idclassM =objc_getClass(cClassName);229unsignedintoutCount, i;230objc_property_t * properties = class_copyPropertyList(classM, &outCount);231for(i =0; i < outCount; i++) {232objc_property_t property =properties[i];233NSString * attributeName =[NSString stringWithUTF8String:property_getName(property)];234235[array addObject:attributeName];236}237returnarray;238}239240@end

在m文件中, 我使用了运行时。 运行时拿到一个模型的属性 这样我们可以更加方便的使用KVC

大家仔细看一下这种封装的过程

2.中间层: ADCoreDataManager.h

1//2//ADCoreDataManager.h3//CoreData_CE4//5//Created by Dylan on 14-10-11.6//Copyright (c) 2014年 Dylan. All rights reserved.7//89#warningadd Model properties Here1011#import<CoreData/CoreData.h>12#import<Foundation/Foundation.h>1314@interfaceADCoreDataManager : NSManagedObject1516/*!17* @Author Dylan.18*19* e.g20*/21@property (nonatomic, strong) NSString *name;2223@end

.m文件

1//2//ADCoreDataManager.m3//CoreData_CE4//5//Created by Dylan on 14-10-11.6//Copyright (c) 2014年 Dylan. All rights reserved.7//89#warningdon't forget write @synthesize1011#import"ADCoreDataManager.h"1213@implementationADCoreDataManager1415@synthesizename =_name;1617- (void)setValue:(id)value forUndefinedKey:(NSString *)key {1819}2021@end

大家可以把所有模型的属性 扔到中间层里边。 使用中间层去做中介传值。

使用:

1. 创建自己的momd文件。 新建-》coredata-》model 创建之后添加模型

2. 初始化单例

附上测试代码

1//test2ADCoreData * coreData = [ADCoreData shareInstanceWithStoreName:@"CoreData"];34Dylan * dylan = [[Dylan alloc] initWithEntity:[NSEntityDescription entityForName:@"Dylan"inManagedObjectContext:coreData.manageContext] insertIntoManagedObjectContext:nil];5[dylan setName:@"Dylan"];67NSLog(@"**************************************************");89NSLog(@"first = %@", [coreData findByModel:dylan]);1011NSLog(@"**************************************************");1213[coreData create:dylan];14NSLog(@"second = %@", [coreData findByModel:dylan]);15NSLog(@"third = %@", [coreData findByModel:dylan predicateString:@"name = 'Dylan'"]);16NSLog(@"**************************************************");1718[coreData remove:dylan];19NSLog(@"fourth = %@", [coreData findByModel:dylan]);20NSLog(@"**************************************************");2122[coreData create:dylan];23NSLog(@"fifth = %@", [coreData findByModel:dylan]);2425NSLog(@"**************************************************");2627Dylan * dylan1 = [[Dylan alloc] initWithEntity:[NSEntityDescription entityForName:@"Dylan"inManagedObjectContext:coreData.manageContext] insertIntoManagedObjectContext:nil];28dylan1.name =@"dylan-1";2930[coreData modify:dylan1 predicateString:nil];31NSLog(@"sixth = %@", [coreData findByModel:dylan]);32NSLog(@"seventh = %@", [coreData findByModel:dylan1]);

CoreData书写虽然比较难, 但是操作方便

大家在使用谓词的时候 要特别的注意 在你的值上边加单引号 类似: name = 'Dylan' 防止CoreData在操作request请求时候出现错误

@Dylan.

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航