二次封装CoreData
Posted pengyuan_D
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二次封装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的主要内容,如果未能解决你的问题,请参考以下文章
对jquery中的$.ajax二次封装 从而多次调用 今天一整天都在想这个事情