iOS开发 - CoreData框架 数据持久化

Core Data

Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的。

传统的数据库要把数据写到数据库,而且要写SQL语句 Core Data 就避免了写SQL语句的麻烦了

CoreData的使用步骤

1.创建模型文件 相当于数据库

2.添加实体 相当表

3.创建实体类 相于模型类

4.生成上下文 关联模型文件生成数据库

5.保存对象到数据库

6.从数据库获取对象

7.更新数据

8.删除数据

1.创建模型文件

所谓的创建模型就是间接生成数据库表

2.添加实体

3.创建实体类

以创建员工实体类为例

生成上下文件 关联模型文件生成数据库

 NSManagedObjectContext  _context = [[NSManagedObjectContext alloc] init];

    // 模型文件
    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

    // 持久化存储调度器
    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"%@",doc);
    NSString *sqlitePath = [doc stringByAppendingPathComponent:@"company.sqlite"];

    //数据存储的类型 数据库存储路径
    [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:nil];

    _context.persistentStoreCoordinator = store;

保存对象到数据库

Employee *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:_context];

    employee.name = @"zhangsan";
    employee.age = @18;
    employee.height = @1.89;

    [_context save:nil];

打开CoreData的SQL语句输出开关

    1.打开Product,点击EditScheme...
    2.点击Arguments,在ArgumentsPassed On Launch中添加2项
    1> -com.apple.CoreData.SQLDebug
    2> 1

CoreData实例

生成实体类

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Employee : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) NSNumber * height;
@end
#import "Employee.h"
@implementation Employee
@dynamic name;
@dynamic age;
@dynamic height;
@end

import头文件框架

#import "ViewController.h"
#import <CoreData/CoreData.h>
#import "Employee.h"

@interface ViewController ()
@property(strong,nonatomic)NSManagedObjectContext *context;
@end

CoreData模糊查询

@implementation ViewController

#pragma mark 模糊查询
- (IBAction)likeSearcher:(id)sender {

    // 查询
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    // 过滤
    // 1.查询以wang开头员工
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@",@"wang"];

    // 2.以si 结尾
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name ENDSWITH %@",@"si"];

    // 3.名字包含 g
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name CONTAINS %@",@"g"];

    // 4.like 以si结尾
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like %@",@"li*"];
    request.predicate = pre;

    //读取信息
    NSError *error = nil;
    NSArray *emps = [self.context executeFetchRequest:request error:&error];
    if (!error) {
        NSLog(@"emps: %@",emps);
        for (Employee *emp in emps) {
            NSLog(@"%@ %@ %@",emp.name,emp.age,emp.height);
        }
    }else{
        NSLog(@"%@",error);
    }

}

CoreData 更新数据

#pragma mark 更新员工信息
- (IBAction)updateEmployee:(id)sender {

    // 把wangwu的身高更改成 1.7
    // 1.查找wangwu
    NSArray *emps = [self findEmployeeWithName:@"wangwu"];

    // 2.更新身高
    if (emps.count == 1) {
        Employee *emp = emps[0];
        emp.height = @1.7;
    }

    // 3.同步(保存)到数据
    [self.context save:nil];
}

-(NSArray *)findEmployeeWithName:(NSString *)name{
    // 1.查找员工
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name=%@",name];
    request.predicate = pre;

    return [self.context executeFetchRequest:request error:nil];

}

CoreData 删除数据

#pragma mark 删除员工
- (IBAction)deleteEmployee:(id)sender {
    [self deleteEmployeeWithName:@"lisi"];
}

-(void)deleteEmployeeWithName:(NSString *)name{
    // 删除zhangsan
    // 1.查找到zhangsan
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name=%@",name];
    request.predicate = pre;

    // 2.删除zhangsan
    NSArray *emps = [self.context executeFetchRequest:request error:nil];

    for (Employee *emp in emps) {
        NSLog(@"删除员工的人 %@",emp.name);
        [self.context deleteObject:emp];
    }

    // 3.用context同步下数据库
    //所有的操作暂时都是在内存里,调用save 同步数据库
    [self.context save:nil];
}

CoreData 查询数据

#pragma mark 读取员工信息
- (IBAction)readEmployee:(id)sender {

    //创建一个请求对象 (填入要查询的表名-实体类)
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

    // 过滤查询
    // 查找张三 并且身高大于1.8
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name=%@ AND height > %@",@"zhangsan",@(1.8)];
//    request.predicate = pre;

    //排序 以身高进行升序
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"height" ascending:NO];
//    request.sortDescriptors = @[sort];

    // 分页查询 总共13条数据 每页显示5条数据
    //第一页的数据
    request.fetchLimit = 5;
    request.fetchOffset = 10;

    //读取信息
    NSError *error = nil;
    NSArray *emps = [self.context executeFetchRequest:request error:&error];
    if (!error) {
        NSLog(@"emps: %@",emps);
        for (Employee *emp in emps) {
            NSLog(@"%@ %@ %@",emp.name,emp.age,emp.height);
        }
    }else{
        NSLog(@"%@",error);
    }
}

#pragma mark 添加员工信息
- (IBAction)addEmployee:(id)sender {

    // 创建员工

    Employee *emp1 = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context];

    // 设置员工属性
    emp1.name = @"lisi";
    emp1.age = @28;
    emp1.height = @2.10;

    //保存 - 通过上下文操作
    NSError *error = nil;
    [self.context save:&error];
    if (!error) {
        NSLog(@"success");
    }else{
        NSLog(@"%@",error);
    }
}

CoreData 创建上下文

-(void)setupContext{

    // 1.上下文 关联Company.xcdatamodeld 模型文件
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];

    // 关联模型文件

    // 创建一个模型对象
    // 传一个nil 会把 bundle下的所有模型文件 关联起来
    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

    // 持久化存储调度器
    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    // 存储数据库的名字
    NSError *error = nil;

    // 获取docment目录
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    // 数据库保存的路径
    NSString *sqlitePath = [doc stringByAppendingPathComponent:@"company.sqlite"];

    [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:&error];

    context.persistentStoreCoordinator = store;

    self.context = context;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    // 创建员工
    for (int i = 0; i < 10; i++) {
        Employee *emp1 = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context];

        // 设置员工属性
        emp1.name = [NSString stringWithFormat:@"wangwu %d",i];
        emp1.age = @(28 + i);
        emp1.height = @2.10;

        //保存 - 通过上下文操作
        NSError *error = nil;
        [self.context save:&error];
        if (!error) {
            NSLog(@"success");
        }else{
            NSLog(@"%@",error);
        }
    }
}
@end

调用

- (void)viewDidLoad {
    [super viewDidLoad];
    // 创建一个数据库 company.sqlite
    // 数据库要一张表 员工表 (name,age,heigt)
    // 往数据添加员工信息
    // CoreData
    [self setupContext];
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 11:06:10

iOS开发 - CoreData框架 数据持久化的相关文章

iOS 通过CoreData实现数据持久化

iOS 通过CoreData实现数据持久化引言: Core Data 是 iOS 3.0 以后引入的数据持久化解决方案,其原理是对 SQLite 的封装,是开发者不需要接触 SQL 语句,就可以对数据库进行的操作. 其编码方式和原理结构方面较为特殊,本博文主要介绍在使用 Core Data 时遇到的各种问题以及对其核心原理进行解释. 参考资料: 1: iOS 教程:Core Data 数据持久性存储基础教程 http://www.dasheyin.com/ios_jiao_cheng_core_

ios开发学习笔记--数据持久化之Core Data

数据持久化之CoreDate 一.     Core Data简介 Core Data是苹果公司为了实现数据持久化提供的一个框架,而不是一个数据库,提供对象-关系映射[ORM]的功能(将对象转化为数据,也能将保存在数据库的数据还原为对象). 虽然底层操作与SQLite相似,但是并不直接写SQL语句,而且只能整个取出实体记录,然后分解之后才能得到某个属性. Core Data能存储的类型:SQLite数据库.XML.二进制.自定义数据类型 一般情况下,Core Data的数据存在沙盒下的Docum

ios开发学习笔记--数据持久化之数据库(SQLite.swift)

数据持久化之SQLite数据库(SQLite.swift使用) 一.     简介 SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了.它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快.SQLite提供的是一些C函数接口,你可以用这些函数操作数据库.通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 SQLite函数,SQLite就会为你操作数据库 一个数据库中的表就算是一个文件,一般是将这个文件放

iOS开发-私人通讯录-数据存储和编辑模式

UI界面 -(void)viewDidLoad{ [super viewDidLoad]: //addTarget:一般用于监听按钮的点击 以及进度条值的改变 //通过通知监听UITextField的改变 /* addObserver:谁来监听 selector:通知发生的时候调用什么方法 name:通知名称 object:谁发送的通知 注意:object不能写nil,因为如果是nil只要是UITextField发生改变都会调用textChange方法,而我们只在账号和密码输入框发生改变的时候才

学习IOS开发UI篇--数据存储

iOS应用数据存储的常用方式 1.lXML属性列表(plist)归档 2.lPreference(偏好设置) 3.lNSKeyedArchiver归档(NSCoding) 4.lSQLite3 5.lCore Data Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录.例如,游戏应用可将游戏存档保存在该目录 tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除.应用没有运行时,系统也可能会清除该目录下的文件.iTunes同步设备时

iOS开发中存储数据的方法

最近被问到一些关于iOS开发中对于数据存储的处理方式,感觉数据存储这个也是经常用到的一个功能的,有必要自己去整理和记录一下的. iOS开发中一般是有四种存储数据的方式,分别是: 1.NSUserDefaults:用来保存用户自己设置的一些属性,用户再次打开程序,或者开机后,这些信息还是存在,NSUserDefaults可以存储的类型包括NSString,NSData,NSNumber,NSDictionary,NSArray.如果要存储其他的数据类型,则需要转化为前面的一些类型,NSUSerDe

iOS开发网络篇—数据缓存

iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器

李洪强iOS开发-网络新闻获取数据思路回顾

李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据  1.1 定义类方法返回单例对象 1.2 单例的实现,设置baseURL,设置超时时长等 02 创建一个分类, 传入一个类的参数返回一个数组,返回当前类的所有属性 用在模型中处理模型数据 03 创建图片轮播模型(model)类发送请求获取轮播图片的数据  3.1 定义属性: 标题,图片 定义两个类方法: (1)传入一个字典的参数

iOS开发——网络篇&amp;数据解析

数据解析 关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了. JSON—— 关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面 NSJSONSerialization 1 -(void)start 2 { 3 4 NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 5