目前学习到数据持久化,但是掌握的还不是很好,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