二次封装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的更多相关文章
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- iOS项目相关@AFN&SDWeb的二次封装
一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m ...
- Quick Cocos (2.2.5plus)CoinFlip解析(MenuScene display AdBar二次封装)
转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工 ...
- 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache
虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或 ...
- Android 应用程序集成Google 登录及二次封装
谷歌登录API: https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...
- Android 应用程序集成FaceBook 登录及二次封装
1.首先在Facebook 开发者平台注册一个账号 https://developers.facebook.com/ 开发者后台 https://developers.facebook.com/ap ...
- 对jquery的ajax进行二次封装
第一种方法: $(function(){ /** * ajax封装 * url 发送请求的地址 * data 发送到服务器的数据,数组存储,如:{"username": " ...
- AFNetworking二次封装的那些事
AFNetworking可是iOS网络开发的神器,大大简便了操作.不过网络可是重中之重,不能只会用AFNetworking.我觉得网络开发首先要懂基本的理论,例如tcp/ip,http协议,之后要了解 ...
- volley二次封装
产品中使用Volley框架已有多时,本身已有良好封装的Volley确实给程序开发带来了很多便利与快捷.但随着产品功能的不断增加,服务器接口的不断复杂化,直接使用Volley原生的JSONObjectR ...
随机推荐
- RecyclerView具体解释
public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild { 由上面的继承结 ...
- VBA调试利器debug.print
作者:iamlaosong 百度一下.非常easy找到debug.print解释和使用介绍.事实上非常简单.就是将代码运行结果显示在"马上窗体"中,但不影响程序运行.VBA程序调试 ...
- matlab 构建数据集实用 api
我们当前有如下目录结构的图像数据集(用于图像分类): 1. imageDatastore imageDatastore:imds = imageDatastore('./images', 'Inclu ...
- Android视频播放软解与硬解的区别
硬解,用自带播放器播放,android中的VideoView 软解,使用音视频解码库,比如FFmpeg 一.硬解码 硬解:就是调用GPU的专门模块编码来解,减少CPU运算,对CPU等硬件要求也相对低点 ...
- Echarts Y轴min显示奇葩问题(做此记录)
项目需求是根据不同情况显示最大值最小值 有9-35 12-50 9-50 三种情况 前面两种可以显示出来 但是9-50的话 最小值9显示不出来 8,7等就可以显示出来 后面想到强制从最小值 ...
- BZOJ1576: [Usaco2009 Jan]安全路经Travel(树链剖分)
Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数 ...
- RS-485总线和Modbus通信协议的关系
一.RS-485总线 RS-485总线技术只是规定了接口的电气标准,并没有规定RS-485接口的电缆,插件以及通信协议,只是OSI规范中物理层的一个标准,RS-485总线采用差分平衡传输方式.由于RS ...
- 如何优雅的写UI——(1)MFC六大核心机制-程序初始化
很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...
- 洛谷 P3669 [USACO17OPEN]Paired Up 牛牛配对
P3669 [USACO17OPEN]Paired Up 牛牛配对 题目描述 Farmer John finds that his cows are each easier to milk when ...
- Java缓存组件 EhCache 入门教程
1.技术背景: 系统缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.缓存设想内存是有限的,缓存的时效性也是有 ...