CoreData使用数据持久化方法封装

突然想起来几年前 我的人生第一个项目,数据持久化全篇使用的CoreData做的,为了纪念,今天找到当年的代码出来,回忆往事。

当时是自己封装了一个handle类 ,把数据库 的增删改查常用操作封装了一下,调用的时候也挺好用的,省得每次都写重复代码,coredata貌似使用的人不多吗,周围同事同行的朋友交流的时候,几乎没有人使用它,这也导致我这个项目交接给下一波同事的时候,经常找我售后服务,讲来讲去,后来的项目再也没用过它了。

关于CoreData的使用网上一堆教程,各位看官可以随意查资料学习!

新建文件coredata操作类:GKCoreDataHandle继承NSObject;

.h文件列出数据持久化常用的增删改查方法:

@interface GKCoreDataHandle : NSObject

// 每次存完数据、修改数据之后执行保存操作

+ (void)saveChangeData;

// 往数据库存(插入)指定实体对象的数据,返回一个实体对象

+ (NSManagedObject*)insertNewObjectFromEntityName:(NSString *)entityName;

// 清除coradata缓存数据的方法- 清楚指定的某个实体对象的数据

+ (void)deleteUserDataFromEntityName:(NSString *)entityName;

// 修改指定实体数据库里面数据(有多条的时候改的最后一条数据)(后期需要指定修改第几条的时候增加下标入参)

+ (void)modifyObjectWithEntityName:(NSString *)entityName replaceData:(id)data;

// 查询SysUser表中的staffId

+ (NSString *)getStaffId;

// 查询coradata缓存数据的方法- 获取查询结果是实体对象数组

+ (NSArray *)fetchCacheDataArrWithEntityName:(NSString *)entityName;

// 查询coradata缓存数据的方法- 获取查询结果是具体的一个实体对象

+ (id)fetchCacheDataObjWithEntityName:(NSString *)entityName;

//查询coradata缓存数据的方法- 通过谓词来查询,返回查询结果的数组

+ (NSArray*)fetchCacheDataArrWithEntityName:(NSString *)entityName andPredicate:(NSPredicate *)predicate;

// 分页查询:传入分页的起始索引fetchOffset 、分页的条数fetchLimit

+ (NSArray*)fetchCacheDataArrWithEntityName:(NSString *)entityName andFetchOffset:(NSInteger)fetchOffset andFetchLimit:(NSInteger)fetchLimit;

@end

.m文件列出具体的方法实现:

#import "GKCoreDataHandle.h"

#import "NSManagedObject_data.h"

@implementation GKCoreDataHandle

#pragma mark - 每次存完数据、修改数据之后执行保存操作

+ (void)saveChangeData {

// 本地用户信息数据

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = delegate.managedObjectContext;

NSError *error;

if ([context save:&error]) {

NSLog(@"数据添加成功");

} else {

NSLog(@"数据添加失败 %@",error);

}

}

- (NSArray *)fetchRequest:(NSString *)entityName {

// 本地用户信息数据

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = delegate.managedObjectContext;

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];

//构造查询对象

NSFetchRequest *request = [[NSFetchRequest alloc] init];

[request setEntity:entity];

NSError* error=nil;

NSArray *fetchResult = [context executeFetchRequest:request error:&error];

if (fetchResult == nil) {

NSLog(@"查询sysuser用户缓存数据失败 Error:%@",error);

return @[];

} else {

return fetchResult;

}

}

#pragma mark - 获取coredata中SysUser表中的staffId

+ (NSString *)getStaffId {

GKCoreDataHandle *gKCoreDataHandle = [[GKCoreDataHandle alloc] init];

NSArray *fetchResult = [gKCoreDataHandle fetchRequest:@"SysUser"];

NSString *staffId = nil;

if (fetchResult != nil) {

for (SysUser* sysUser in fetchResult) {

staffId = sysUser.staffId;

break;

}

} else {

staffId = @"";

}

return staffId;

}

#pragma mark - 查询结果是:实体对象数组

+ (NSArray *)fetchCacheDataArrWithEntityName:(NSString *)entityName {

// 本地用户信息数据

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = delegate.managedObjectContext; // 获取上下文

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init]; // 构造查询对象

[request setEntity:entity];

NSError* error=nil;

NSArray *fetchResult = [context executeFetchRequest:request error:&error];

if (fetchResult == nil) {

NSLog(@"查询用户缓存数据失败 Error:%@",error);

return @[];

} else {

return fetchResult;

}

}

#pragma mark - 查询结果是:一个实体对象

+ (id)fetchCacheDataObjWithEntityName:(NSString *)entityName {

// 本地用户信息数据

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = delegate.managedObjectContext; // 获取上下文

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init]; // 构造查询对象

[request setEntity:entity];

NSError* error=nil;

NSArray *fetchResult = [context executeFetchRequest:request error:&error];

if (fetchResult == nil) {

NSLog(@"查询用户缓存数据失败 Error:%@",error);

return @"";

} else {

return fetchResult.lastObject;

}

}

#pragma mark - 通过谓词来查询,返回查询结果的数组

+ (NSArray*)fetchCacheDataArrWithEntityName:(NSString *)entityName andPredicate:(NSPredicate *)predicate {

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = delegate.managedObjectContext; // 获取上下文

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init]; // 构造查询对象

[request setEntity:entity];

request.predicate = predicate; // 查询的条件

NSError* error=nil;

NSArray *fetchResult = [context executeFetchRequest:request error:&error];

if (fetchResult == nil) {

NSLog(@"查询用户缓存数据失败 Error:%@",error);

return @[];

} else {

return fetchResult;

}

}

#pragma mark - 清除指定实体对象的数据

+ (void)deleteUserDataFromEntityName:(NSString *)entityName {

//清除用户数据

AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];

//1. 获得context

NSManagedObjectContext *context = app.managedObjectContext;

[context reset];

NSEntityDescription *description = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init];

[request setIncludesPropertyValues:NO];

[request setEntity:description];

NSError *error = nil;

NSArray *datas = [context executeFetchRequest:request error:&error];

if (!error && datas && [datas count])

{

for (NSManagedObject *obj in datas)

{

[context deleteObject:obj];

}

if (![context save:&error])

{

NSLog(@"error:%@",error);

}

[context save:nil]; //  删除后 保存空

}

}

#pragma mark - 往数据库存(插入)指定实体对象的数据

+ (NSManagedObject*)insertNewObjectFromEntityName:(NSString *)entityName {

AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];

// 获得context

NSManagedObjectContext *context = app.managedObjectContext;

return [NSEntityDescription  insertNewObjectForEntityForName:entityName inManagedObjectContext:context];;

}

#pragma mark - 修改指定实体数据库里面数据(有多条的时候改的最后一条数据)(后期需要指定修改第几条的时候增加下标入参)

+ (void)modifyObjectWithEntityName:(NSString *)entityName replaceData:(id)data {

if (data) {

NSArray *fetchResult = [self fetchCacheDataArrWithEntityName:entityName];

NSManagedObject *entity = [fetchResult lastObject];

entity.data = data;

[self saveChangeData];

}

}

#pragma mark - 分页查询

+ (NSArray*)fetchCacheDataArrWithEntityName:(NSString *)entityName andFetchOffset:(NSInteger)fetchOffset andFetchLimit:(NSInteger)fetchLimit {

AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSManagedObjectContext *context = delegate.managedObjectContext; // 获取上下文

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];

NSFetchRequest *request = [[NSFetchRequest alloc] init]; // 构造查询对象

[request setEntity:entity];

request.fetchOffset = fetchOffset; // 分页的起始索引

request.fetchLimit = fetchLimit; // 分页的条数

NSError* error=nil;

NSArray *fetchResult = [context executeFetchRequest:request error:&error];

if (fetchResult == nil) {

NSLog(@"查询用户缓存数据失败 Error:%@",error);

return @[];

} else {

return fetchResult;

}

}

@end

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

推荐阅读更多精彩内容