二次封装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 ...
随机推荐
- [NOI.AC#41]最短路 线性基
链接 题解 如果不加边,两个点之间的长度是唯一的(只能走最短路径),因为如果重复走,就异或掉了. 因此,先DFS预处理一下每个点到根的距离 \(d[x]\) ,那么 \(x,y\) 之间的距离为 $d ...
- Apache通用日志工具commons-logging和Log4j使用总结
转自:https://blog.csdn.net/lzl13391522110/article/details/53758536 Apache通用日志工具commons-logging和Log4j使用 ...
- 字符设备驱动-------Linux异常处理体系结构
裸机中断流程 外部触发 CPU 发生中断, 强制的跳到异常向量处 跳转到具体函数 保存被中断处的现场(各种寄存器的值) 执行中断处理函数,处理具体任务 恢复被中断的现场 Linux处理异常流程 异常发 ...
- socket 笔记(一)
#include "stdafx.h" #include "WINSOCK2.H" #pragma comment(lib,"WS2_32.lib&q ...
- Spring RootBeanDefinition,ChildBeanDefinition,GenericBeanDefinition
转自:https://blog.csdn.net/joenqc/article/details/68942972 RootBeanDefinition,ChildBeanDefinition,Gene ...
- openGLES(二)
顶点和着色器 我们使用独立的点集合构建物体,都是使用顶点,之后会使用着色绘制图性,以及告诉OpenGLES如何绘制的小程序. 片段着色器,即每个小的像素的渲染, 顶点着色器确定所绘制图像的 ...
- Android Material风格的应用(四)--FloatActionButton
添加 FloatActionButton和SnackBar Android Material风格的应用(一)--AppBar TabLayoutAndroid Material风格的应用(二)--Re ...
- JS学习笔记 - fgm练习 - 输入数字求和 正则replace onkeyup事件
<style> body{font-size: 12px;} .outer{ width: 500px; margin: 0 auto; } span{ color: #999; } in ...
- JS学习笔记 - 面向对象 - 选项卡 (普通选项卡改写)
选项卡3 <script> window.onload=function () { new TabSwitch('div1'); }; function TabSwitch(id) // ...
- var let 区别
var a = 5; var b = 10; if (a === 5) { let a = 4; // if 块级作用域 var b = 1; // 函数级作用域 console.log(a); // ...