CoreData 数据持久化框架是Cocoa API的一部分,它允许按照 实体-属性-值 模型组织数据,并以XML(做MAC-os用), 二进制, 或者SQLite数据文件的格式持久化数据. CoreData主要提供 对象-关系映射(ORM)功能,把OC对象转化为数据保存到文件,也可以数据转化成OC对象.
CoreData与SQLite区别 :
CoreData是官方推出的数据持久化框架,SQLite是苹果使用别人开发好的一个动态库,本质是关系型数据库.
CoreData是iOS平台下的一个数据持久化的方式,不可以跨平台使用,Sqlite可以跨平台使用.
核心对象:
NSPersistentStoreCoordinator 数据连接器类(中间人,不能直接控制)
NSManagedObjectContext 数据管理器类 (临时数据库 )
NSManagedObject 数据管理类
NSManagedObject 数据模型器类
NSEntityDescription 实体描述类
操作过程: context想要获取值,先要告诉连接器,我要什么东西,连接器再告诉store,你给我什么东西,store去找,找到之后返回给context.
数据库的简单操作
.xcdatamodeld里
Add Entity 添加实体类
修改实体类名
修改属性名与类型
创建文件 command+N —> CoreData —> NSManageObjuect subclass
ViewController.m 里
导入框架及各种头文件
//coreData的框架
//导入框架的方式: <框架名字/头文件名字>
#import
#import"Person.h"
#import"AppDelegate.h"
@interfaceViewController()
@property(nonatomic,strong)UITableView*tableView;
//临时数据库
@property(nonatomic,strong)NSManagedObjectContext*objectContext;
//创建一个可变数组,配合table设置cell的相关设置
@property(nonatomic,strong)NSMutableArray*dataArray;
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.dataArray= [NSMutableArrayarray];
[selfsetup];
//
[selfappdelegate];
//调用searchAll
[selfsearchAll];
}
- (void)setup{
self.tableView= [[UITableViewalloc]initWithFrame:[UIScreenmainScreen].boundsstyle:(UITableViewStylePlain)];
self.tableView.backgroundColor= [UIColorredColor];
[self.viewaddSubview:self.tableView];
self.tableView.dataSource=self;
self.tableView.delegate=self;
[self.tableViewregisterClass:[UITableViewCellclass]forCellReuseIdentifier:@"cell"];
}
- (void)appdelegate{
//通过单例的代理协议的代理人,获取到我们最开始使用的AppDelegate
AppDelegate*app = (AppDelegate*)[UIApplicationsharedApplication].delegate;
//获得 数据库的数据连接器
self.objectContext= app.managedObjectContext;
self.navigationItem.rightBarButtonItem= [[UIBarButtonItemalloc]initWithBarButtonSystemItem:(UIBarButtonSystemItemAdd)target:selfaction:@selector(barButtonItemClicked)];
}
//点击方法
- (void)barButtonItemClicked{
//NSEntityDescription :实体描述类,通过类方法创建
//参数1 :表示这个实体描述类描述的是哪个实体
//参数2 :表示的是在context里创建一个描述,告诉context我要往里面插入以object了
NSEntityDescription*description = [NSEntityDescriptionentityForName:@"Person"inManagedObjectContext:self.objectContext];
//创建一个实体类
//参数1 :实体类描述
//参数2 :在context里放入这个类
Person*person = [[Personalloc]initWithEntity:descriptioninsertIntoManagedObjectContext:self.objectContext];
intnumber =arc4random() % 2000;
person.name= [NSStringstringWithFormat:@"%d号",number];
[selfinsertObject:person];
}
// 增向coreData中插入一条数据
- (void)insertObject:(Person*)person{
NSError*error =nil;
//把context保存到本地
//这个方法执行之后,本地数据才发生改变
[self.objectContextsave:&error];
if(error ==nil) {
NSLog(@"保存正确");
[self.dataArrayaddObject:person];
NSIndexPath*indexPath = [NSIndexPathindexPathForRow:self.dataArray.count-1inSection:0];
[self.tableViewinsertRowsAtIndexPaths:@[indexPath]withRowAnimation:(UITableViewRowAnimationMiddle)];
}else{
NSLog(@"错误%@",error);
}
}
// 删
-(void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath{
if(editingStyle ==UITableViewCellEditingStyleDelete) {
//获取想要删的数据
Person*person =self.dataArray[indexPath.row];
//在context中将这条数据删除
[self.objectContextdeleteObject:person];
NSError*error =nil;
[self.objectContextsave:&error];
if(error ==nil) {
//先删除数据
[self.dataArrayremoveObject:person];
//然后更新UI
[self.tableViewdeleteRowsAtIndexPaths:@[indexPath]withRowAnimation:(UITableViewRowAnimationFade)];
}
}
}
// 改
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
//知道改谁
Person*person =self.dataArray[indexPath.row];
intnumber =arc4random() % 2000;
person.name= [NSStringstringWithFormat:@"%d好", number];
NSError*error =nil;
[self.objectContextsave:&error];
if(error ==nil) {
[self.tableViewreloadRowsAtIndexPaths:@[indexPath]withRowAnimation:(UITableViewRowAnimationMiddle)];
}
}
// 查
- (void)searchAll{
//创建一个查询操作,查询哪个表里的内容
NSFetchRequest*request = [[NSFetchRequestalloc]initWithEntityName:@"Person"];
//接收查询数据
NSError*error =nil;
//
NSArray*array = [self.objectContextexecuteFetchRequest:requesterror:&error];
//判断error
if(error ==nil) {
//如果是,那就放到dataArray里面
[self.dataArraysetArray:array];
[self.tableViewreloadData];
}else{
}
}
//tableView必须实现的方法
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{
returnself.dataArray.count;
}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:@"cell"forIndexPath:indexPath];
//创建实例接收
Person*person =self.dataArray[indexPath.row];
cell.textLabel.text= person.name;
returncell;
}
@end