Core Data 数据持久化
Core Data
1.Core Data 是数据持久化存储的最佳方式
2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型
在Mac OS X 10.5Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式
3.好处:能够合理管理内存,避免使用sql的麻烦,高效
4.构成:
创建工程时将core data选项勾选上, Xcode7之后会添加上include Unit Tests 选项, 可选可不选, 不选则系统默认将BOOL类型改为NSNumber类型
添加了 文件
在AppDelegate.h和AppDelegate.m中就会添加Core Data相应的属性和方法
AppDelegate.h
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
//被管理对象上下文
//内容, 在 coredata内 用来"临时"存储数据使用
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
//被管理对象模型
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
//持久化存储助理
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
@end
AppDelegate.m
(1)NSManagedObjectContext(被管理的数据上下文)
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
(2)NSManagedObjectModel(被管理的数据模型)
数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
(3)NSPersistentStoreCoordinator(持久化存储助理)
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时
(4)NSManagedObject(被管理的数据记录)
相当于数据库中的表格记录
(5)NSFetchRequest(获取数据的请求)
相当于查询语句
(6)NSEntityDescription(实体结构)
相当于表格结构
(7)后缀为.xcdatamodeld的包
里面是.xcdatamodel文件,用数据模型编辑器编辑
编译后为.momd或.mom文件
打开文件, 点击左下角+号, 新建Person类
点击Editor 选择Create NSManagedObject Subclass创建数据模型, 自动生成Person Model
Core Data具体使用示例
在storyboad中创建删除 搜索 添加三个button 和 tableView
效果图:
具体实现代码:
#import "ViewController.h"
#import "AppDelegate.h"
#import "Person.h"
@interface ViewController ()<UITableViewDataSource, UITableViewDelegate>
- (IBAction)deletePerson:(id)sender;
- (IBAction)selectPerson:(id)sender;
- (IBAction)addPerson:(id)sender;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *dataArr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cellID"];
//初始化可变数组
self.dataArr = [@[] mutableCopy];
//从coredata本地取出存储的数据
//1.找到app delegate
AppDelegate *app = [[UIApplication sharedApplication] delegate];
//2.创建检索对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
//通过检索上下文内取出相应地数组
NSArray *array = [app.managedObjectContext executeFetchRequest:request error:nil];
//数组想要copy, 内部元素就必须遵守NSCoping协议
// self.dataArr = [array mutableCopy];
[self.dataArr addObjectsFromArray:array];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)deletePerson:(id)sender {
//如果tableView处于编辑状态, 就取消编辑, 反之, 进入编辑状态
if (self.tableView.editing) {
// self.tableView.editing = NO;
[self.tableView setEditing:NO animated:YES];
} else {
[self.tableView setEditing:YES animated:YES];
}
}
- (IBAction)selectPerson:(id)sender {
AppDelegate *app = [[UIApplication sharedApplication] delegate];
//创建检索条件
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
request.predicate = [NSPredicate predicateWithFormat:@"age>25"];
NSArray *selectArr = [app.managedObjectContext executeFetchRequest:request error:nil];
//清空原先的数据
[self.dataArr removeAllObjects];
//将新的数据添加进数组中
[self.dataArr addObjectsFromArray:selectArr];
//刷新界面
[self.tableView reloadData];
}
- (IBAction)addPerson:(id)sender {
//使用coredata管理的对象, 需要继承自NSManagedObject
//获取app delegate
AppDelegate *app = [[UIApplication sharedApplication] delegate];
//创建实体描述对象
NSEntityDescription *description = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:app.managedObjectContext];
//创建被管理对象
//把被管理对象插入上下文内
Person *p = [[Person alloc] initWithEntity:description insertIntoManagedObjectContext:app.managedObjectContext];
NSArray *nameArr = @[@"闯神", @"龙神", @"宗主", @"班长", @"万少", @"四火", @"陈晨", @"金华", @"周洁", @"梦阳", @"欢欢", @"广恩", @"淑宁", @"艳萍"];
p.name = nameArr[arc4random()%(nameArr.count)];
//年龄随机[18, 27]
p.age = @(arc4random()%10+18);
//性别随机
p.gender = @(arc4random()%2);
//保存修改
[app saveContext];
//把person添加进tableView的数据源里面
[self.dataArr addObject:p];
[self.tableView reloadData];
}
#pragma mark-UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID"];
Person *p = self.dataArr[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"我叫%@, 年龄%@, 性别%@", p.name, p.age, [p.gender intValue] == 0?@"女":@"男"];
return cell;
}
#pragma mark-UITableViewDelegate
//提交tableView的编辑
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//1.
AppDelegate *app = [[UIApplication sharedApplication] delegate];
//2. 先找到这一行对应的model
Person *p = self.dataArr[indexPath.row];
//3. 从coredata的上下文内删除对应的对象
[app.managedObjectContext deleteObject:p];
//4. 从数组中删除对应的对象
[self.dataArr removeObject:p];
//5.从tableView中删除对应的cell
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:YES];
}
}
@end