本文由我们团队的丁武龙组内分享总结
一、简介
1.coreData是iOS5之后出的一个新的框架,其本质上还是对sqlite的封装,偏向于面向对象,能够将OC对象转化成数据储存到sqlite中,也能够将sqlite数据库中的数据转化成OC对象,可用于数据缓存,因为它能够管理APP里面的数据模型,所以会极大的减少代码量
2.coreData和SQLite对比
SQLite
1、基于C接口,需要使用SQL语句,代码繁琐
2、在处理大量数据时,表关系更直观
3、在OC中不是可视化,不易理解
coreData
1、可视化,且具有undo/redo能力
2、可以实现多种文件格式:
* NSSQLiteStoreType
* NSBinaryStoreType
* NSInMemoryStoreType
* NSXMLStoreTyp
3、苹果官方API支持,与iOS结合更紧密
coreData核心类与结构
NSManagedObjectContext(数据上下文)
* 对象管理上下文,负责数据的实际操作(重要)
* 作用:插入数据,查询数据,删除数据,更新数据
NSPersistentStoreCoordinator(持久化存储助理)
* 相当于数据库的连接器
* 作用:设置数据存储的名字,位置,存储方式,和存储时机
NSManagedObjectModel(数据模型)
* 数据库所有表格或数据结构,包含各实体的定义信息
* 作用:添加实体的属性,建立属性之间的关系
* 操作方法:视图编辑器,或代码
NSManagedObject(被管理的数据记录)
* 数据库中的表格记录
NSEntityDescription(实体结构)
*相当于表格结构
NSFetchRequest(数据请求)
* 相当于查询语句
二、操作步骤
1.首先创建一个工程并添加一个模型文件
2.在模型文件添加实体(实体名首字母必须大写),并在实体内添加需要的属性
3.创建一个模型文件StudentModel ,和coredataManager文件,主要用于对数据库操作
三、代码实现
StudentModel.h
#import <Foundation/Foundation.h>
@interface StudentModel : NSObject
@property (nonatomic ,copy) NSString *name;
@property (nonatomic ,copy) NSString *sex;
@property (nonatomic ,copy) NSString *age;
@end
coredataManager.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface coredataManager : NSObject
+(coredataManager *)sharedManager;
-(void)insertModel:(id)model; //插入数据
-(NSMutableArray *)getAllData; //获取数据
-(void)deleteAllDatas; //删除数据
@end
coredataManager.m
1.coreData初始化
{
NSManagedObjectContext *_context;
}
- (instancetype)init
{
self = [super init];
if (self) {
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"coredata" ofType:@"momd"]]];
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Documents/app.db",NSHomeDirectory()]] options:nil error:nil]; //储存至本地
_context = [[NSManagedObjectContext alloc] init];
_context.persistentStoreCoordinator = store;
}
return self;
}
//单例
+(coredataManager *)sharedManager{
static coredataManager *sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[coredataManager alloc] init];
});
return sharedManager;
}
2.插入数据
//插入数据
-(void)insertModel:(id)model
{
//根据Entity名称和NSManagedObjectContext获取一个新的继承于NSManagedObject
id obj = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];
StudentModel *appModel = model;
//给StudentModel赋值
[obj setValue:appModel.name forKey:@"name"];
[obj setValue:appModel.age forKey:@"age"];
[obj setValue:appModel.sex forKey:@"sex"];
//保存文本
[_context save:nil];
}
3.查询数据
//获取所有数据
-(NSMutableArray *)getAllData
{
NSMutableArray *retArray = [[NSMutableArray alloc] init];
//获取查询请求
NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
//发送请求
NSArray *array = [_context executeFetchRequest:req error:nil];
//遍历数据取值
for (id obj in array) {
StudentModel *appModel = [[StudentModel alloc] init];
appModel.name = [obj valueForKey:@"name"];
appModel.sex = [obj valueForKey:@"sex"];
appModel.age = [obj valueForKey:@"age"];
[retArray addObject:appModel];
}
return retArray;
}
4.删除数据
//删除数据
-(void)deleteAllDatas
{
//创建删除请求
NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
//发送请求
NSArray *array = [_context executeFetchRequest:req error:nil];
for (id obj in array) {
[_context deleteObject:obj];
}
[_context save:nil];
}
4.修改数据
-(void)changeData{
//创建查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
//发送请求
NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@" , @"男"];
request.predicate = pre;
NSArray *resArray = [_context executeRequest:request error:nil];
//修改数据
for (StudentModel *appModel in resArray) {
appModel.sex = @"女";
}
NSError *error = nil;
if ([_context save:&error]) {
NSLog(@"数据更新成功");
}else{
NSLog(@"数据更新失败");
}
}
四、运行
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//插入
StudentModel *model = [[StudentModel alloc] init];
for (NSInteger i = 0 ; i < 10; i ++) {
model.name = [NSString stringWithFormat:@"name%ld",i];
model.age = [NSString stringWithFormat:@"1%ld",i];
model.sex = @"男";
[[coredataManager sharedManager] insertModel:model];
}
//查询数据
NSLog(@"%@",[[coredataManager sharedManager] getAllData]);
//删除数据
[[coredataManager sharedManager] deleteAllDatas];
//修改
[[coredataManager sharedManager] changeData];
}