看过一篇封装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(一)封装使用的更多相关文章

  1. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  3. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  4. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  5. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  6. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  7. 封装集合(Encapsulate Collection)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...

  8. CSharpGL(29)初步封装Texture和Framebuffer

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...

  9. CSharpGL(7)对VAO和VBO的封装

    CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...

随机推荐

  1. 关于ASP.NET MVC中的视图生成

    在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据.   从控制器到视图 ...

  2. Ubuntu等Linux系统清除DNS缓存的方法

    buntu等Linux系统清除DNS缓存的方法 直接说方法: 如果系统下有nscd,那么就直接 sudo /etc/init.d/nscd restart 如果没有也没关系,网上接受的方法大都是 su ...

  3. python中如何单独测试一个函数的作用

    #!/usr/bin/python import os def get_env_varible(key): return os.getenv(key) if __name__ == '__main__ ...

  4. Filter及FilterChain的使用详解

    原文地址:http://blog.csdn.net/zhaozheng7758/article/details/6105749 一.Filter的介绍及使用 什么是过滤器? 与Servlet相似,过滤 ...

  5. FCKEditor的用法(asp版)

    1:下载FCKEditor 去www.baidu.com 搜索,我本来想上传的,但不知道怎么传.下载下来后解压到你网站的目录,最好就放在根目录下,文件夹名字就用FCKEditor:这里可以随便自己喜好 ...

  6. HttpClient支持使用代理服务器以及身份认证

    HttpClient Authentication Doument: http://hc.apache.org/httpclient-3.x/authentication.html HttpClien ...

  7. BZOJ3396: [Usaco2009 Jan]Total flow 水流

    3396: [Usaco2009 Jan]Total flow 水流 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 45  Solved: 27[Sub ...

  8. HDOJ(HDU) 1491 Octorber 21st

    Problem Description HDU's 50th birthday, on Octorber 21st, is coming. What an exciting day!! As a st ...

  9. ios 限制输入长度

    ----------------UITextField限制输入的长度------------ - (BOOL)textField:(UITextField *)textField shouldChan ...

  10. css——基础样式总结

    颜色和单位的使用 颜色 用颜色的名字表示颜色,比如:red 用16进制表示演示 比如:#FF0000 用rgb数值表示颜色,rgb(红,绿,蓝),每个值都在0-255之间一般都用16进制表示颜色 单位 ...