CoreData是一个专门管理数据服务的框架,把OC对象和存储在SQLite文件中的数据进行互相转换,极大地方便了开发者在数据服务方面的开发。

1. 创建CoreData

在文件创建区下,选择【Core Data】下的【Data Model】

输入CoreData的文件名Model.xcdatamodel

Model.xcdatamodeld文件默认是Swift的,如果想要改成oc,可以在打开Model.xcdatamodeld文件,在右侧工具栏中修改。

2. 创建Entity

CoreData文件下面有个【Add Entity】的按钮,点击它就创建了一个空表。
可以在Entity里面添加AttributesRelationshipsFetched Properties,分别是属性、关联关系以及获取操作。

属性类型

类型 说明
Integer 16 整数,范围是-32768 ~ 32767
Integer 32 整数,范围是-2147483648 ~ 2147483647
Integer 64 整数,范围是–9223372036854775808 ~ 9223372036854775807
Decimal 数值,用NSDecimalNumber表示
Double 双精度浮点数
Float 浮点数
String 字符串,用NSString表示
Boolean 代表布尔值
Date 日期时期
Binary Data 二进制,用NSData表示
URI URL对象,用NSURL表示
Transformable Objective对象,要遵守NSCoding协议

关联关系的Inverse属性表示是否可以从一个实体中找到另一个实体,这样使两个实体具有双向的关联关系。

【Editor Style】按钮可以看出实体和属性的关系,以及可以看出实体之间的对应的关系。

3. 生成模型文件

选择【Editor】菜单下的【Create NSManagedObject Subclass…】


最终生成StudentModelTeacherModel文件

StudentModel+CoreDataClass文件里面StudentModel继承了NSManagedObject

@class TeacherModel;@interface StudentModel : NSManagedObject
@end

StudentModel+CoreDataProperties文件

@interface StudentModel (CoreDataProperties)+ (NSFetchRequest<StudentModel *> *)fetchRequest;@property (nonatomic) int32_t age;
@property (nullable, nonatomic, copy) NSString *name;
@property (nullable, nonatomic, retain) TeacherModel *teacher;@end@implementation StudentModel (CoreDataProperties)+ (NSFetchRequest<StudentModel *> *)fetchRequest {return [NSFetchRequest fetchRequestWithEntityName:@"StudentModel"];
}@dynamic age;
@dynamic name;
@dynamic teacher;@end

4. CoreData核心类

类名 说明
NSPersistentStoreCoordinator 数据库的连接器,设置数据存储的名字,位置,存储方式等
NSManagedObjectContext 负责应用与数据库之间的交互,增删改查基本操作都要用到
NSManagedObjectModel 被管理的数据模型,可以添加实体及实体的属性,为xxx.xcdatamodeld文件
NSManagedObject 从CoreData中取出来的对象,默认都是NSManagedObject对象,通过键值对来存取所有的实体属性,相当于数据库中的表格记录
NSFetchRequest 获取数据时的请求

一般都在AppDelegate中创建,以便在各处使用

@property(nonatomic, strong) NSManagedObjectModel *managedObjectModel;
@property(nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;- (NSManagedObjectModel *)managedObjectModel {if (!_managedObjectModel) {// 创建数据模型文件,类型为momdNSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];}return _managedObjectModel;
}- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {if (!_persistentStoreCoordinator) {// 创建数据库连接器_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];// 关联相关的sqlite文件,如果没有则创建一个新的NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true).lastObject;NSURL *sqliteUrl = [NSURL URLWithString:[docPath stringByAppendingPathComponent:@"blog.sqlite"]];[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqliteUrl options:nil error:nil];}return _persistentStoreCoordinator;
}- (NSManagedObjectContext *)managedObjectContext {if (!_managedObjectContext) {// 创建上下文对象,ConcurrencyType主要有NSPrivateQueueConcurrencyType和NSMainQueueConcurrencyType// NSPrivateQueueConcurrencyType表示私有并发队列的类型,操作也是在子线程中完成// NSMainQueueConcurrencyType表示主并发队列类型,在UI上的操作,使用这个参数初始化_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];// 关联数据库连接器_managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator;}return _managedObjectContext;
}- (void)saveContext {NSError *error = nil;if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) {NSLog(@"saveContext error = %@", error.userInfo);}
}

5. 数据操作

查找操作,NSFetchRequest查询特定实体,NSPredicate限制查询条件,。

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"StudentModel"];if (name.length > 0) {NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", name];request.predicate = predicate;
}NSArray *data = [self.managedObjectContext executeFetchRequest:request error:nil];

插入操作,通过NSEntityDescriptioninsert进行插入操作,添加到数据库中

StudentModel *student = [NSEntityDescription insertNewObjectForEntityForName:@"StudentModel"inManagedObjectContext:self.managedObjectContext];
student.name = self.nameTextField.text;
student.age = [self.ageTextField.text intValue];[self saveContext];

编辑操作,需要先查询需要删除的托管对象,self.currentModel是上面查询到的某条数据

self.currentModel.name = self.nameTextField.text;
self.currentModel.age = [self.ageTextField.text intValue];[self saveContext];

删除操作,同编辑操作,也需先查询托管对象

[self.managedObjectContext deleteObject:self.currentModel];[self saveContext];

源码下载: https://github.com/nai-chen/IosBlog

iOS CoreData的使用相关推荐

  1. iOS coredata 多表查询

    先创建几个表. 1.部门表:department dp_id  Integer primary key dp_deptname  varchar(20) //使用coredata实体创建时用strin ...

  2. iOS CoreData (一) 增删改查

    代码地址如下: http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系 ...

  3. iOS CoreData简单入门 - Swift版

    CoreData --- Swift 1,创建IOS项目并选择使用CoreData,选择语言Swift 2,打开项目目录 会有一项 CoreDataDemo.xcdatamodeld ,打开它,添加 ...

  4. IOS CoreData 简单使用CURD

    2019独角兽企业重金招聘Python工程师标准>>> iOS在CoreData中简单封装了SQLite,让开发者不需要写sql语句就可以使用SQLite进行CURD操作. 要使用C ...

  5. IOS: CoreData

    本篇主要介绍IOS Swift 中CoreData的基本用法和一些自己的理解 CoreData是一个数据库框架,可以让在app上本地存储一些数据,也有数据库基本的增删改查功能 CoreData有三部分 ...

  6. iOS - CoreData了解和简单应用

    core data是一种本地数据存储方式,和archiver,sqllite的作用差不多 CoreData主要目的是简化开发离线体验的成本,它抽象了设备的本地存储API,应用方向当然是为App提供离线 ...

  7. ios CoreData的使用(封装)

    本文讲解CoreData的使用,封装: 文章末尾附有demo 一.CoreData的简单理解 CoreData是一个模型层的技术,也是一种持久化技术,它能将模型对象的状态持久化到磁盘里,我们不需要使用 ...

  8. ios: coreData的NSManagedObject setvalue为null

    当用到coredata的时候,当你存数据: NSManagedObject *oneObject = [NSEntityDescriptioninsertNewObjectForEntityForNa ...

  9. iOS CoreData版本升级和数据库迁移

    2018年10月24日 10:20:00 https://blog.csdn.net/weixin_34168700/article/details/86021876 app中使用了CoreData, ...

最新文章

  1. 用eclipse阅读编辑android和kernel,uboot的源代码
  2. 用nginx搭建基于rtmp或者http的flv、mp4流媒体服务器
  3. curl get post 示例
  4. java web.xml_Java Web之XML基础
  5. 字符串2在字符串1中第一次出现的位置strstr()
  6. 【OpenCV 例程200篇】69. 连续非周期信号的傅立叶系数
  7. opencv画框返回坐标 python_20行Python代码实现视频字符化
  8. 实现下拉菜单的宽度与登录人ID长度的匹配
  9. python约瑟夫生死小游戏的实现
  10. 判断zk是否挂掉_Zookeeper入门学习第一天,zk集群简单介绍
  11. 《『若水新闻』客户端开发教程》——17.软件自动更新
  12. 四、Oracle的复杂查询
  13. Java实现国密算法SM2,SM3,SM4,并且实现ECB和CBC模式
  14. 读headFirst设计模式 - 装饰者模式
  15. 【GoCN酷Go推荐】protobuf生成Go代码插件gogo/protobuf
  16. 如何创建 “抢占实例” 云服务器BCC?抢占式实例云服务器创建步骤
  17. Python 变量作用域问题 函数名.变量名
  18. 我的优点是会使用计算机用英语怎,优点用英语,我的50个优点。
  19. python ssl module_Python升级后ssl模块不可用问题解决和浅析
  20. 前端适配不同型号手机分辨率,100%还原UI设计稿的方案实践

热门文章

  1. 华为系统更新后通知栏变大了_华为EMUI又有新变动,通知栏新增多功能,流畅度堪比氢OS!...
  2. 基于Python3.6配置开发环境
  3. 【转载】超简单集成HMS ML Kit 人脸检测实现可爱2D贴纸
  4. Windows下搭建局域网内简易git服务器
  5. python基础知识大一总结与反思_反思总结及规划 其一
  6. MyBatis_Plus(Spring版本笔记)
  7. JAVA SE 第一章 计算机、程序和Java概述
  8. 如何减小电压跟随器输出电阻_逐次比较式模数转换器如何获取最佳采样频率
  9. 全球及中国丝蛋白行业研究及十四五规划分析报告
  10. 绘制几何图形,生成辅助线的思路