美文网首页iOS OC 学习手册
CoreData使用数据持久化方法封装

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

作者: LYPC_下里巴人 | 来源:发表于2017-08-11 13:13 被阅读21次

    突然想起来几年前 我的人生第一个项目,数据持久化全篇使用的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

    相关文章

      网友评论

        本文标题:CoreData使用数据持久化方法封装

        本文链接:https://www.haomeiwen.com/subject/sbulrxtx.html