iOS Coredata的抽象管理类

如何来设计这个抽象类,我们可以根据oo(面向对象)的思想先来分析一下有哪些对象,这有对象又有哪些行为.

对象:    

①管理者,manager类,为了线程安全,这个变量应该是全局的.

②表,Entity对象

行为:

①创建数据库,不需暴露,创建一次就可以

②增加数据,需暴露的接口

③删除数据,需暴露的接口

④修改数据,需暴露的接口

⑤查询数据,需暴露的接口



一    实例化manager类:

static CoreDataManager *_manager;

+ (instancetype)shareManager

{

return [[self alloc] init];

}

+ (instancetype)allocWithZone:(struct _NSZone *)zone

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_manager = [super allocWithZone:zone];

});

return _manager;



NSManagedObjectContext:An object representing a single object space or scratch pad that you use to fetch, create, and save managed objects.

官方文档的意思是需要通过这个上下文对象来进行对coredata的增删改查操作.

所以manger就需要拥有Context这个属性

@interface CoreDataManager()

@property (nonatomic , strong)NSManagedObjectContext *context;

@end

通过懒加载的方式来实例化content,并创建数据库

- (NSManagedObjectContext *)context

{

if (!_context) {

//1.经过编译后数据模型文件的扩展名由xcdatamodeld变成了momd

NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];

//2.构建CoreData的模型文件

NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];

//3.通过模型文件创建PersistentStoreCoordinator对象

NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

//4.数据库存储路径URL

NSURL *dbUrl = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"test.sqlite"]];

//5.设置persistStore的持久化存储方式为SQLiteStoreType,代表persistStore会自动生成一个SQLite数据库文件来实现持久化存储,并会自动生成SQL语句来做CRUD(增删改查)

/***************************************************数据库升级*****************************************************************************/

NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],

NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption, nil];

if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbUrl options:optionsDictionary error:nil]) {

NSLog(@"failed to add persistent store with type to persistent store coordinator");

}

/****************************************************************************************************************************************/

//6.NSManagedObjectContext:所有的ManagedObject的增删改查都是在context上进行的。

//NSMainQueueConcurrencyType:这个context所关联的控制器和UI控件只能在主线程中使用

_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

_context.persistentStoreCoordinator = coordinator;

return _context;

}



二    提供增删改查的接口的内部实现

//MARK: -

//MARK: --插入数据

- (void)insertParameter:(NSDictionary *)parameter tableName:(NSString *)tableName

{

NSManagedObject *obj = [NSEntityDescription insertNewObjectForEntityForName:tableName inManagedObjectContext:self.context];

for (NSString *key in parameter.allKeys) {

[obj setValue:parameter[key] forKey:key];

}

if ([self.context save:nil]) {

NSLog(@"save success");

}else{

NSLog(@"save failure");

}

}

//MARK: -

//MARK: --删除

- (void)deleteDataWithTableName:(NSString *)tableName predicate:(NSPredicate *)predicate

{

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:tableName];

request.predicate = predicate;

NSArray *results = [self.context executeFetchRequest:request error:nil];

for (NSManagedObject *obj in results) {

[self.context deleteObject:obj];

}

if ([self.context save:nil]) {

NSLog(@"save success");

}else{

NSLog(@"save failure");

}

}

//MARK: -

//MARK: -- 更新数据

- (void)updateWithAttribute:(id)attribute key:(NSString *)key tableName:(NSString *)tableName predicate:(NSString *)predicateString

{

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:tableName];

NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];

request.predicate = predicate;

NSArray *results = [self.context executeFetchRequest:request error:nil];

for (NSManagedObject *obj in results) {

[obj setValue:attribute forKey:key];

}

//保存

if ([self.context save:nil]) {

NSLog(@"operate success");

}else{

NSLog(@"operate failed");

}

}

//MARK: -

//MARK: --查询数据

- (NSArray *)selectWithTableName:(NSString *)tableName predicate:(NSString *)predicateString

{

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:tableName];

NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];

request.predicate = predicate;

NSArray *results = [self.context executeFetchRequest:request error:nil];

return results;

}



三    导入coredata文件并进行设置






四    增删改查

//MARK: -

//MARK: --增

- (IBAction)add:(id)sender {

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:1],

@"name" : @"AAA",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:2],

@"name" : @"BBB",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:3],

@"name" : @"CCC",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:4],

@"name" : @"DDD",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:5],

@"name" : @"EEE",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:6],

@"name" : @"FFF",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:7],

@"name" : @"GGG",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:8],

@"name" : @"HHH",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:9],

@"name" : @"III",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:10],

@"name" : @"JJJ",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:11],

@"name" : @"KKK",

} tableName:Table_People];

[Manager insertParameter:@{

@"age" : [NSNumber numberWithInt:12],

@"name" : @"LLL",

} tableName:Table_People];

}


//MARK: -

//MARK: --删

- (IBAction)delete:(id)sender {

[Manager deleteDataWithTableName:Table_People predicate:@"age=1"];

}



//MARK: -

//MARK: --改

- (IBAction)update:(id)sender {

[Manager updateWithAttribute:@"KimmyKing" key:@"name" tableName:Table_People predicate:@"name='BBB'"];

}


//MARK: -

//MARK: --查

- (IBAction)select:(id)sender {

NSArray *arr = [Manager selectWithTableName:Table_People predicate:@"age>10"];

for (People *p in arr) {

NSLog(@"%@今年%@岁了",p.name,p.age);

}

}


五    数据库升级

当数据库需要增加或修改字段时,原有的数据库就不能使用了,需要使用新的数据库


最后附上demo链接:戳我

喜欢点赞哦~

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

推荐阅读更多精彩内容