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

目前学习到数据持久化,但是掌握的还不是很好,FRC还没有学到,但是能够模拟的写一个自己管理coreData的类了,有的方法不一定能够执行,但是思路是对的,等以后学的更加深,会对该文章进行修改.


coreData的创建过程:


1、首先找到New File -> IOS -> Core Data -> Data Model

iOS开发-------手写一个数据持久化(Coredata)的类_第1张图片

2、点击next,编辑coreData的名字,点create

iOS开发-------手写一个数据持久化(Coredata)的类_第2张图片


3、在coredata文字的左下角会有add Entity按键,点击就能创建model了,注:实体的名字的第一个字母必须大写


iOS开发-------手写一个数据持久化(Coredata)的类_第3张图片


我的coredata文件




相关类的创建过程:

1、首先找到New File -> IOS -> Core Data -> NSManagedObject subclass

iOS开发-------手写一个数据持久化(Coredata)的类_第4张图片



2、next之后会出现自动找到的coredata文件,选中想用的cordite

        

iOS开发-------手写一个数据持久化(Coredata)的类_第5张图片


3、next之后选择自己创建的实体,点next

             iOS开发-------手写一个数据持久化(Coredata)的类_第6张图片


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


你可能感兴趣的:(数据,管理,博客,coredata)