iOS数据库操作-coreData

722 阅读3分钟

本文由我们团队的丁武龙组内分享总结

一、简介

1.coreData是iOS5之后出的一个新的框架,其本质上还是对sqlite的封装,偏向于面向对象,能够将OC对象转化成数据储存到sqlite中,也能够将sqlite数据库中的数据转化成OC对象,可用于数据缓存,因为它能够管理APP里面的数据模型,所以会极大的减少代码量
2.coreData和SQLite对比
SQLite

1、基于C接口,需要使用SQL语句,代码繁琐
2、在处理大量数据时,表关系更直观
3、在OC中不是可视化,不易理解

coreData

1、可视化,且具有undo/redo能力
2、可以实现多种文件格式:
    * NSSQLiteStoreType
    * NSBinaryStoreType
    * NSInMemoryStoreType
    * NSXMLStoreTyp
3、苹果官方API支持,与iOS结合更紧密

coreData核心类与结构

NSManagedObjectContext(数据上下文)
* 对象管理上下文,负责数据的实际操作(重要)
* 作用:插入数据,查询数据,删除数据,更新数据

NSPersistentStoreCoordinator(持久化存储助理)
* 相当于数据库的连接器
* 作用:设置数据存储的名字,位置,存储方式,和存储时机

NSManagedObjectModel(数据模型)
* 数据库所有表格或数据结构,包含各实体的定义信息
* 作用:添加实体的属性,建立属性之间的关系
* 操作方法:视图编辑器,或代码

NSManagedObject(被管理的数据记录)
* 数据库中的表格记录

 NSEntityDescription(实体结构)
*相当于表格结构

NSFetchRequest(数据请求)
* 相当于查询语句

二、操作步骤

1.首先创建一个工程并添加一个模型文件

2.在模型文件添加实体(实体名首字母必须大写),并在实体内添加需要的属性

3.创建一个模型文件StudentModel ,和coredataManager文件,主要用于对数据库操作

三、代码实现

StudentModel.h

#import <Foundation/Foundation.h>

@interface StudentModel : NSObject
@property (nonatomic ,copy) NSString *name;
@property (nonatomic ,copy) NSString *sex;
@property (nonatomic ,copy) NSString *age;

@end

coredataManager.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface coredataManager : NSObject


+(coredataManager *)sharedManager;

-(void)insertModel:(id)model;  //插入数据

-(NSMutableArray *)getAllData;   //获取数据

-(void)deleteAllDatas;    //删除数据

@end

coredataManager.m

1.coreData初始化

{
    NSManagedObjectContext *_context;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"coredata" ofType:@"momd"]]];

        NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

        [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Documents/app.db",NSHomeDirectory()]] options:nil error:nil];  //储存至本地

        _context = [[NSManagedObjectContext alloc] init];
        _context.persistentStoreCoordinator = store;
    }
    return self;
}
//单例
+(coredataManager *)sharedManager{
    static coredataManager *sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[coredataManager alloc] init];
    });

    return sharedManager;
}

2.插入数据

//插入数据
-(void)insertModel:(id)model
{
    //根据Entity名称和NSManagedObjectContext获取一个新的继承于NSManagedObject
    id obj = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];

    StudentModel *appModel = model;
    //给StudentModel赋值
    [obj setValue:appModel.name forKey:@"name"];
    [obj setValue:appModel.age forKey:@"age"];
    [obj setValue:appModel.sex forKey:@"sex"];
    //保存文本
    [_context save:nil];
}

3.查询数据

//获取所有数据
-(NSMutableArray *)getAllData
{
    NSMutableArray *retArray = [[NSMutableArray alloc] init];
    //获取查询请求
    NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
    //发送请求
    NSArray *array = [_context executeFetchRequest:req error:nil];
    //遍历数据取值
    for (id obj in array) {
        StudentModel *appModel = [[StudentModel alloc] init];
        appModel.name = [obj valueForKey:@"name"];
        appModel.sex = [obj valueForKey:@"sex"];
        appModel.age = [obj valueForKey:@"age"];

        [retArray addObject:appModel];
    }

    return retArray;
}

4.删除数据

//删除数据
-(void)deleteAllDatas
{
   //创建删除请求
    NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
    //发送请求
    NSArray *array = [_context executeFetchRequest:req error:nil];

    for (id obj in array) {
        [_context deleteObject:obj];
    }

    [_context save:nil];
}

4.修改数据

-(void)changeData{
    //创建查询请求
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
    //发送请求
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"sex = %@" , @"男"];
    request.predicate = pre;

    NSArray *resArray = [_context executeRequest:request error:nil];
    //修改数据
    for (StudentModel *appModel in resArray) {
        appModel.sex = @"女";
    }
    NSError *error = nil;
    if ([_context save:&error]) {
        NSLog(@"数据更新成功");
    }else{
        NSLog(@"数据更新失败");
    }
}

四、运行

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //插入
    StudentModel *model = [[StudentModel alloc] init];
    for (NSInteger i = 0 ; i < 10; i ++) {
        model.name = [NSString stringWithFormat:@"name%ld",i];
        model.age = [NSString stringWithFormat:@"1%ld",i];
        model.sex = @"男";
        [[coredataManager sharedManager] insertModel:model];
    }
    //查询数据
    NSLog(@"%@",[[coredataManager sharedManager] getAllData]);
    //删除数据
    [[coredataManager sharedManager] deleteAllDatas];
    //修改
    [[coredataManager sharedManager] changeData];


}