目前学习到数据持久化,但是掌握的还不是很好,FRC还没有学到,但是能够模拟的写一个自己管理coreData的类了,有的方法不一定能够执行,但是思路是对的,等以后学的更加深,会对该文章进行修改.
coreData的创建过程:
1、首先找到New File -> IOS -> Core Data -> Data Model
2、点击next,编辑coreData的名字,点create
3、在coredata文字的左下角会有add Entity按键,点击就能创建model了,注:实体的名字的第一个字母必须大写
我的coredata文件
相关类的创建过程:
1、首先找到New File -> IOS -> Core Data -> NSManagedObject subclass
2、next之后会出现自动找到的coredata文件,选中想用的cordite
3、next之后选择自己创建的实体,点next
4、然后点击create就可以自动创建一个类似JavaBean 的model对象了
5、生成的model对象如下
头文件:People.h
// // People.h // Coredata自写练习 // // Created by YueWen on 15/9/9. // Copyright (c) 2015年 YueWen. All rights reserved. // #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface People : NSManagedObject @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSString * tele; @end
People.m文件
// // People.m // Coredata自写练习 // // Created by YueWen on 15/9/9. // Copyright (c) 2015年 YueWen. All rights reserved. // #import "People.h" @implementation People @dynamic name; @dynamic tele; @end
下面是管理类的相关代码:
头文件:
// // CoreDataManager.h // Coredata自写练习 // // Created by YueWen on 15/9/9. // Copyright (c) 2015年 YueWen. All rights reserved. // #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface CoreDataManager : NSObject //定义上下文对象 @property(nonatomic,strong,readonly)NSManagedObjectContext * managerContext; //单例方法 +(instancetype)shareCoreDataManager; @end
实现文件
// // CoreDataManager.m // Coredata自写练习 // // Created by YueWen on 15/9/9. // Copyright (c) 2015年 YueWen. All rights reserved. // #import "CoreDataManager.h" #import "People.h" #define MODELNAME @"PeopleModel" @implementation CoreDataManager //实现单例方法 +(instancetype)shareCoreDataManager { static CoreDataManager * coredataManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ coredataManager = [[CoreDataManager alloc]init]; }); return coredataManager; } //重写init方法 - (instancetype)init { self = [super init]; if (self) { //运行加载数据的方法 } return self; } //加载数据的方法 -(void)loadData { //获取本地模型的url NSURL * url = [[NSBundle mainBundle]URLForResource:MODELNAME withExtension:@"momd"]; //根据本地模型的url 创建模型对象 NSManagedObjectModel * model = [[NSManagedObjectModel alloc]initWithContentsOfURL:url ]; //根据模型对象创建协调者 NSPersistentStoreCoordinator * coordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model]; //获取沙盒目录 document的url url = [self applicationDocumentDirctory]; //定义一个错误对象 NSError * error; //通过沙盒目录的url和协调者创建文件 NSPersistentStore * store = [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"test.sqlite" URL:url options:nil error:&error]; //如果创建的文件出错 if (!store) { NSLog(@"%@",[error localizedDescription]); } //根据store创建上下文对象 NSManagedObjectContext * context = [[NSManagedObjectContext alloc]init]; //为上下文设置协调者 [context setPersistentStoreCoordinator:coordinator]; //赋值 _managerContext = context; } //添加数据 -(void)addData { //创建一个实体的托管对象 People * people = [NSEntityDescription insertNewObjectForEntityForName:@"People" inManagedObjectContext:self.managerContext]; //如果是修改,需要先获取一个对象 //为托管对象赋值 people.name = @"小明"; people.tele = @"1325489542"; NSError * error; //保存 if(![self.managerContext save:&error]) { NSLog(@"%@",[error localizedDescription]); } } //查询对象 -(NSArray *)queryData { //创建一个请求 NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"People"]; //设置一个排序描述,根据姓名升序 NSSortDescriptor * descrptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; //请求添加排序规则 [request setSortDescriptors:@[descrptor]]; //创建一个谓词对象,实行具体的查询 NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name = 小明"]; //还可以设置查询的限制属性 [request setFetchBatchSize:3];//表示一次性查询3个 [request setFetchLimit:2];//表示以供查询2个 [request setFetchOffset:2];//表示从第2个开始查 NSError * error; //上下文对象执行请求,如果返回的数组为nil if (!request ) { NSLog(@"%@",[error localizedDescription]); return nil; } return [self.managerContext executeFetchRequest:request error:&error]; } //删除对象,该对象必须真实存在于上下文中,不然会报错 -(void)delectData { //假设我要删除查询后的最后一个对象 NSManagedObject * managedObject = [[self queryData] lastObject]; //执行删除操作 [self.managerContext deleteObject:managedObject]; NSError * error; //如果保存出错了 if (![self.managerContext save:&error]) { NSLog(@"%@",[error localizedDescription]); } } //获取沙盒目录中 document的url -(NSURL *)applicationDocumentDirctory { return [[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; } @end