iOS_SN_CoreDate(一)封装使用
看过一篇封装CoreData的文章挺不错,有基本使用封装,但是没有写怎么与tableView结合使用,我自己用的过程有些小波折,自己做了一个demo,大家可以看源码一些基本使用应该不难了,
原文:http://blog.csdn.net/pengyuan_d/article/details/40657225?utm_source=tuicool&utm_medium=referral
(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
本文GitHub地址https://github.com/zhangkiwi/iOS_SN_CoreData
iOS_SN_CoreDate(一)封装使用的更多相关文章
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- iOS开发之App间账号共享与SDK封装
上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...
- Ajax实现原理,代码封装
都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- 封装集合(Encapsulate Collection)
封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...
- CSharpGL(29)初步封装Texture和Framebuffer
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...
- CSharpGL(7)对VAO和VBO的封装
CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...
随机推荐
- decode()与case then 学习与使用
今天做项目的时候遇到一个oracle数值转换的问题,按需求需要对匹配系统时间进行固定赋值,为了避免增加复杂度并易于维护,尽量不要使用存储过程或触发器,最好是使用oracle 自带函数. 如: SQL& ...
- OnCreate
用于创建插入符 /* CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm);//得到窗口字体信息 CreateSolidCaret ...
- v9站点自定义变量
打开 \phpcms\modules\admin\templates\site_edit.tpl.php 文件,找到最后一个 </fieldset> ,在他后面添加一下代码:<!-- ...
- 一个php小白找工作的历程
一个php小白找工作的历程其实对新工作还是有点忐忑的,对于我这样一个有着特殊工作经历的来说更是如此.为了更好的迎接未来,不得不总结下过去.在经历一段时间的职业生涯探索期后,还是觉得自己更适合做程序员这 ...
- Centos+nginx+uwsgi+Python多站点环境搭建
前言 新公司的第一个项目,服务器端打算用python作为restful api.所以需要在Centos上搭建nginx+fastcgi+python的开发环境,但后面网上很多言论都说uwsgi比fas ...
- XP系统显示文件夹选项属性被删除解决注册表
Title:XP系统显示文件夹选项属性被删除解决注册表 -- 2010-11-18 13:17 昨天中了个毒窝,还有恶意软件,十分不爽. 开始恶意软件把显示所有文件夹给删除了,去找了个注册表,重新注册 ...
- Oracle 基本命令
(1)查看所有表 >select * from tab; (2)查看表结构 >desc 表名; (3)将查询出来的字段显示为其他名称 >select empno as 员工编号 fr ...
- Javascript Promise 学习(上)
Promise 就是处理异步的一个规范方法 a();b();alert("a");如果a() 里面有一个ajax 或者settimeout 那么alert("a" ...
- 创建Windows服务(Windows Services)N种方式总结
最近由于工作需要,写了一些windows服务程序,有一些经验,我现在总结写出来.目前我知道的创建创建Windows服务有3种方式:a.利用.net框架类ServiceBaseb.利用组件Topshel ...
- Qt入门(5)——用Qt控件创建一个电话本界面
具体实现步骤: 一.首先用 Qt Designer 创建一个两张图的对话框,分别保存为listdialog.ui和editdialog.ui文件 要注意其中各个空间对应的名称修改好 二.新建一个Qt应 ...