• 二次封装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];

    }


  • 相关阅读:
    Jquery消息提示插件toastr使用详解
    spingboot jar 包启动遇到得坑
    freemarker使用shiro标签(spring boot)
    sping boot 集成shiro
    java 线程安全(初级)
    java GC jvm 内存分布 和新生代,老年代,永久代,(详细)
    java的新生代 老年代 永久代
    windows下rabbitmq(架构师必备神器)集群搭建
    友盟移动开发平台.NET版本SDK
    jstree无限级菜单ajax按需动态加载子节点
  • 原文地址:https://www.cnblogs.com/llguanli/p/7399731.html
Copyright © 2020-2023  润新知