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

}

时间: 2024-07-29 20:23:17

二次封装CoreData的相关文章

iOS项目相关@AFN&amp;SDWeb的二次封装

一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m .h定义了HTTP常用的四种GET POST PUT DELETE 请求 一般分别用做增删减查 定义前预处理,请求成功处理,请求失败处理的block 及带多参数w的方法声明 .m设置请求类型跟响应类型,监听网络是否有网络,如果没有,弹出网络异常的警示框 2. UIImageView+WebCache.h及

HtmlTestRunner二次封装(TestRunner.py)

将HtmlTestRunner进行二次封装,是报告生成的更方便 import HTMLTestRunner import unittest import time, os class TestRunner(object): def __init__(self, cases="./"): self.case = cases def get_all_cases(self, class_name): return unittest.defaultTestLoader.loadTestsFro

pywinauto二次封装(pywinnat.py)

将pywinauto常用方法进行封装,使得pywinauto用起来更简单 #头文件的引入 from pywinauto import application from pywinauto import clipboard import SendKeys import win32api import win32con import os, sys, time #二次封装的类 class Pywin(object): #======================= # pywin framwork

二次封装dojo slider

上次的二次封装timeslider,挺有意思,又来封装一个dojo的,样式还是用arcgis的.实现更多功能,包括HorizontalSlider和VerticalSlider, 刻度的显示隐藏,标签的显示和隐藏,上刻度和下刻度的显示隐藏,无序数显示刻度,标签图标的自由选择,大小选择....更多功能大家看完code也可以自己慢慢加进去哈~~~ code有点长,先上slider的class::MyCustomSlider.js [javascript] view plain copy /** * 

二次封装arcgis的timeslider

arcgis的timeslider是对dojo slider二次封装,项目需要,所有Map用统一样式的slider,所以写了一个common的dojo class,统一调用生成slider,作为对timeslider再次封装,感觉挺好用. 这个slider不一定要在Map里使用,还可以在其他地方调用.只是要包含arcgis的js包, 先上JavaScript class的code: [javascript] view plain copy /** * yilei create for IES  

毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,

加密狗复制备份 克隆 破解 OEM信息 二次封装 行业软件破解 批发零售

加密狗复制备份 加密狗模拟   加密狗破解  定制写狗程序 算法注册机 OEM信息 二次封装 汉化  行业软件破解   酒店客房管理  餐饮娱乐 美容美发  会员管理  口腔诊所 口腔医院管理 商超POS 服装鞋帽 家具生产数控 家具设计拆单 排料优化 家居设计销售 药店管理 汽配汽修汽贸4S店管理 财务进销存 OA办公 企业积分制管理 电脑行业管理系统 客户管理...等各行业管理软件批发零售 合作联系QQ:309889372 部分产品列表展示 部分产品分类展示: 服装设计类行业: 主要针对服装

也谈Volley的二次封装

产品中使用Volley框架已有多时,本身已有良好封装的Volley确实给程序开发带来了很多便利与快捷.但随着产品功能的不断增加,服务器接口的不断复杂化,直接使用Volley原生的JSONObjectRequest已经导致Activity或Fragment层中耦合了大量的数据解析代码,同时当多处调用同一接口时,类似的数据解析代码还不可复用,导致大量重复代码的出现,已经让我越发地无法忍受.基于此,最近思考着对Volley原生的JSONObjectRequest(因为产品中目前和服务器交互所有的接口,

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的分析,探索OkHttp这个框架的使用和封装 一.追其原理 Android系统提供了两种HTTP通信类 HttpURLConnection HttpClient Google推荐使用HttpURLConnection,这个没必要多说,事实上,我这篇写的应该算是比较晚了,很多优秀的博文都已经提出了这些观