当前位置: 代码迷 >> 综合 >> iOS开发-------手写一个数据持久化(Coredata)的类
  详细解决方案

iOS开发-------手写一个数据持久化(Coredata)的类

热度:98   发布时间:2024-01-04 06:44:27.0

目前学习到数据持久化,但是掌握的还不是很好,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
{//获取本地模型的urlNSURL * url = [[NSBundle mainBundle]URLForResource:MODELNAME withExtension:@"momd"];//根据本地模型的url 创建模型对象NSManagedObjectModel * model = [[NSManagedObjectModel alloc]initWithContentsOfURL:url];//根据模型对象创建协调者NSPersistentStoreCoordinator * coordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:model];//获取沙盒目录 document的urlurl = [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;//上下文对象执行请求,如果返回的数组为nilif (!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