二次封装CoreData

Posted pengyuan_D

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二次封装CoreData相关的知识,希望对你有一定的参考价值。

(1)创建一个Data Model文件,命名为MyModel.xcdatamodeld

(2)创建Users表,添加如图的字段

(3)创建NSManagedObject subclass表实体文件

(4)在Users.m文件中,覆写description方法




CoreDataDBHelper.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

// 本地文件存储的路径
#define PATH [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/sqlite.db"]

#define MODEL_NAME @"MyModel"

@interface CoreDataDBHelper : NSObject

    // 1.数据模型对象
    NSManagedObjectModel *_managedObjectModel;
    
    // 2.创建本地持久文件对象
    NSPersistentStoreCoordinator *_persistentStoreCoordinator;
    
    // 3.管理数据对象
    NSManagedObjectContext *_managedObjectContext;


// 设计成单例模式
+ (CoreDataDBHelper *)shareCoreDataDBHelper;

// 添加数据的方法
- (BOOL)insertDataWithModelName:(NSString *)modelName
          setAttributWithDic:(NSDictionary *)params;

// 查看
/*
    modelName           :实体对象类的名字
    predicateString     :谓词条件
    identifers          :排序字段集合
    ascending           :是否升序
 */
- (NSArray *)selectDataWithModelName:(NSString *)modelName
                     predicateString:(NSString *)predicateString
                                sort:(NSArray *)identifers
                           ascending:(BOOL)ascending;

// 修改
- (BOOL)updateDataWithModelName:(NSString *)modelName
                predicateString:(NSString *)predicateString
             setAttributWithDic:(NSDictionary *)params;

// 删除
- (BOOL)deleteDataWithModelName:(NSString *)modelName
                predicateString:(NSString *)predicateString;

@end
CoreDataDBHelper.m

#import "CoreDataDBHelper.h"

@implementation CoreDataDBHelper

- (instancetype)init

    self = [super init];
    if (self)
    
        // 1.数据模型对象
        NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:MODEL_NAME withExtension:@"momd"];
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
        
        // 2.创建本地持久文件对象
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_managedObjectModel];
        // 设置本地数据的保存位置
        NSURL *fileUrl = [NSURL fileURLWithPath:PATH];
        
        [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:fileUrl options:nil error:nil];
        
        // 3.管理数据对象
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:_persistentStoreCoordinator];
    
    return self;



// 设计成单例模式
+ (CoreDataDBHelper *)shareCoreDataDBHelper

    static CoreDataDBHelper *coreDataDBHelper = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        coreDataDBHelper = [[CoreDataDBHelper alloc] init];
    );
    
    return coreDataDBHelper;


// 添加数据的方法
/*
    params : @ 
                  @"name":@"张三",
                  @"age":@20
             
 */
- (BOOL)insertDataWithModelName:(NSString *)modelName
             setAttributWithDic:(NSDictionary *)params

    NSEntityDescription *entity = [NSEntityDescription insertNewObjectForEntityForName:modelName inManagedObjectContext:_managedObjectContext];
    
    // 遍历参数字典
    for (NSString *key in params)
    
        SEL selector = [self selWithKeyName:key];
        if ([entity respondsToSelector:selector])
        
            [entity performSelector:selector withObject:params[key]];
        
    
    [_managedObjectContext insertObject:entity];
    
    // 保存到本地
    return [_managedObjectContext save:nil];


// 查看
/*
 modelName           :实体对象类的名字
 predicateString     :谓词条件
 identifers          :排序字段集合
 ascending           :是否升序
 */
- (NSArray *)selectDataWithModelName:(NSString *)modelName
                     predicateString:(NSString *)predicateString
                                sort:(NSArray *)identifers
                           ascending:(BOOL)ascending

    // 1.创建实体对象
    NSEntityDescription *entity = [NSEntityDescription entityForName:modelName inManagedObjectContext:_managedObjectContext];
    
    // 2.创建一个查询对象
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    // 告诉查询对象你要查询的数据类型
    [request setEntity:entity];
    
    // 添加查询条件
    if (predicateString != nil || [predicateString isEqualToString:@""])
    
        NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
        [request setPredicate:predicate];
    
    
    
    // 3.设置排序
    NSMutableArray *sortDescriptors = [NSMutableArray array];
    for (NSString *identifer in identifers)
    
        // 创建排序对象
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:identifer ascending:ascending];
        // 把排序对象添加到数组中
        [sortDescriptors addObject:sortDescriptor];
    
    // 把排序对象设置到查询对象里面
    [request setSortDescriptors:sortDescriptors];
    
    // 3.开始查询
    return [_managedObjectContext executeFetchRequest:request error:nil];



// 修改
- (BOOL)updateDataWithModelName:(NSString *)modelName
                predicateString:(NSString *)predicateString
             setAttributWithDic:(NSDictionary *)params

    // 获取所有需要修改实体对象
    NSArray *entitys = [self selectDataWithModelName:modelName predicateString:predicateString sort:nil ascending:NO];
    
    // 遍历所有的实体对象
    for (NSEntityDescription *entity in entitys)
    
        // 修改对象的属性
        for (NSString *key in params)
        
            SEL selector = [self selWithKeyName:key];
            if ([entity respondsToSelector:selector])
            
                [entity performSelector:selector withObject:params[key]];
            
        
    
    
    return [_managedObjectContext save:nil];
    


// 删除
- (BOOL)deleteDataWithModelName:(NSString *)modelName
                predicateString:(NSString *)predicateString

    // 获取所有需要修改实体对象
    NSArray *entitys = [self selectDataWithModelName:modelName predicateString:predicateString sort:nil ascending:NO];
    
    // 遍历所有的实体对象
    for (NSEntityDescription *entity in entitys)
    
        // 删除对象
        [_managedObjectContext deleteObject:entity];
        
    
    
    return [_managedObjectContext save:nil];



// 通过一个字符串反回一个set方法
- (SEL)selWithKeyName:(NSString *)keyName

    NSString *first = [[keyName substringToIndex:1] uppercaseString];
    NSString *end = [keyName substringFromIndex:1];
    NSString *selString = [NSString stringWithFormat:@"set%@%@:",first,end];
    return NSSelectorFromString(selString);


@end


- (NSString *)description

    return [NSString stringWithFormat:@"id:%@,name:%@,age;%@",self.userId,self.userName,self.age];


以上是关于二次封装CoreData的主要内容,如果未能解决你的问题,请参考以下文章

对jquery中的$.ajax二次封装 从而多次调用 今天一整天都在想这个事情

Swift 3.1 Coredata 按字母升序排序,但保留以数字开头的记录

CoreData 中的 NSDate 是不是封装了时区?

面向对象封装思想小结

Hadoop 二次排序

iOS(Swift) 基于 Moya 的二次封装