iOS CoreData总结
相关主要类:
NSManagedObjectContext 管理对象,上下文,持久性存储模型对象,处理数据与应用的交互
NSManagedObjectModel 被管理的数据模型,数据结构
NSPersistentStoreCoordinator 添加数据库,设置数据存储的名字,位置,存储方式
NSManagedObject 被管理的数据记录
NSFetchRequest 数据请求
NSEntityDescription 表格实体结构
相关操作:
Editor -> Add Model Version : 创建新的数据库
Editor -> Create NSManagerObject SubClass 创建模型对象文件
注意点:
1.Codegen 属性要设置为 None ,不然再手动生成显示的模型对象文件多报错。(默认是隐式文件,但是使用实体类时,无法引用文件)
2.
// 创建托管对象模型 @“lwCoreDataDemo”是CoreData的文件名;@“momd”是.xcdatamodel文件,用数据模型编辑器编辑编译后为.momd或.mom文件,所以就写@“momd”,
NSURL *modelpath = [[NSBundle mainBundle] URLForResource:@"lwCoreDataDemo" withExtension:@"momd"];
NSLog(@"------modelpath:%@",modelpath);
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelpath];
1.初始化
2.增删改查操作
3.数据量迁移:主要设置,不然无法找到 当前的模型文件
//请求自动轻量级迁移
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:datapath] options:options error:nil];
4.多表操作
// 多表插入
Student * student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];
student.age = arc4random()%10;
student.name = @"jack"; Course *course = [NSEntityDescription insertNewObjectForEntityForName:@"Course" inManagedObjectContext:_context];
course.course_id = arc4random()%20;
course.course_name = @"英语";
// [student addStu_course:[NSSet setWithObject:course]];
student.stu_course = [NSSet setWithObject:course]; Classes *classes = [NSEntityDescription insertNewObjectForEntityForName:@"Classes" inManagedObjectContext:_context];
classes.class_name = [NSString stringWithFormat:@"高二(%u)班",arc4random()%3];
classes.class_id = arc4random()%10;
student.stu_classes = classes;
// 多表查询
NSFetchRequest *requst1 = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
requst1.predicate = [NSPredicate predicateWithFormat:@"stu_classes.class_name=%@",@"高二(1)班"]; NSArray *res1 = [_context executeFetchRequest:requst1 error:nil];
[res1 enumerateObjectsUsingBlock:^(Student * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"Student:[name:%@,age:%hd]",obj.name,obj.age);
}];
5.代码
封装的工具类:
.h文件

//
// LWCoreDataManager.h
// lwCoreDataDemo
//
// Created by LWQ on 2020/6/29.
// Copyright 2020 LWQ. All rights reserved.
// #import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "Person+CoreDataClass.h"
#import "Student+CoreDataClass.h"
#import "Classes+CoreDataClass.h"
#import "Course+CoreDataClass.h" @interface LWCoreDataManager : NSObject
@property (nonatomic, strong) NSManagedObjectContext * context; + (instancetype)share; - (void)insert;
- (NSArray<Person *>*)query;
- (void)delete;
- (void)update; + (NSString *)personString:(Person *)p;
@end
LWCoreDataManager.h
.m文件

//
// LWCoreDataManager.m
// lwCoreDataDemo
//
// Created by LWQ on 2020/6/29.
// Copyright 2020 LWQ. All rights reserved.
// #import "LWCoreDataManager.h" @implementation LWCoreDataManager + (instancetype)share
{
static LWCoreDataManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[LWCoreDataManager alloc] init];
[instance installConfigure];
});
return instance;
} //安装配置
- (void)installConfigure
{
// 创建托管上下文对象
_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:(NSMainQueueConcurrencyType)]; // 创建托管对象模型
NSURL *modelpath = [[NSBundle mainBundle] URLForResource:@"lwCoreDataDemo" withExtension:@"momd"];
NSLog(@"------modelpath:%@",modelpath);
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelpath]; // 创建持久化存储调度器
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; // 创建数据库文件并关联持久化存储调度器
NSString *datapath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
datapath = [datapath stringByAppendingFormat:@"/%@.sqlite",@"lwCoreDataDemo"];
NSLog(@"------datapath:%@",datapath); //请求自动轻量级迁移
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:datapath] options:options error:nil]; // 上下文对象设置属性为持久化存储器
_context.persistentStoreCoordinator = store; } //插入插入
- (void)insert
{
// 单表插入
// Person * model = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:_context];
// NSLog(@"--------mode:%@",model.class);
//
// model.age = arc4random()%20;
// model.name = @"lwq";
// model.address = @"bj";
// model.num = arc4random()&10; // 多表插入
Student * student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];
student.age = arc4random()%10;
student.name = @"jack"; Course *course = [NSEntityDescription insertNewObjectForEntityForName:@"Course" inManagedObjectContext:_context];
course.course_id = arc4random()%20;
course.course_name = @"英语";
// [student addStu_course:[NSSet setWithObject:course]];
student.stu_course = [NSSet setWithObject:course]; Classes *classes = [NSEntityDescription insertNewObjectForEntityForName:@"Classes" inManagedObjectContext:_context];
classes.class_name = [NSString stringWithFormat:@"高二(%u)班",arc4random()%3];
classes.class_id = arc4random()%10;
student.stu_classes = classes; NSError *error ;
if ([_context hasChanges]) {
[_context save:&error];
}
if (error) {
NSLog(@"插入数据失败");
}
NSLog(@"插入数据成功");
} // 查询
- (NSArray<Person *>*)query
{
// 多表查询
NSFetchRequest *requst1 = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
requst1.predicate = [NSPredicate predicateWithFormat:@"stu_classes.class_name=%@",@"高二(1)班"]; NSArray *res1 = [_context executeFetchRequest:requst1 error:nil];
[res1 enumerateObjectsUsingBlock:^(Student * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"Student:[name:%@,age:%hd]",obj.name,obj.age);
}]; // 单表查询
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
NSArray<Person *> *res = [_context executeFetchRequest:request error:nil];
[res enumerateObjectsUsingBlock:^(Person * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@",[LWCoreDataManager personString:obj]);
}];
return res;
} //删除操作
- (void)delete
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"age < 10"];
request.predicate = pred; NSArray *res = [_context executeFetchRequest:request error:nil];
[res enumerateObjectsUsingBlock:^(Person * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[_context deleteObject:obj];
}];
NSError *error;
if ([_context hasChanges]) {
[_context save:&error];
}
if (error) {
NSLog(@"删除数据失败");
}
NSLog(@"删除i数据成功");
} //更新操作
- (void)update
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; request.predicate = [NSPredicate predicateWithFormat:@"age >10"]; NSArray *res = [_context executeFetchRequest:request error:nil]; [res enumerateObjectsUsingBlock:^(Person* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
obj.age = 12;
obj.name = @"rose";
obj.num = 100;
}];
NSError *error;
if ([_context hasChanges]) {
[_context save:&error];
}
if (error) {
NSLog(@"更新数据数据失败");
}
NSLog(@"更新数据成功");
} + (NSString *)personString:(Person *)p
{
return [NSString stringWithFormat:@"Person:[age:%hd,name:%@,address:%@,num:%hd]",p.age,p.name,p.address,p.num];
} @end
LWCoreDataManager.m
CoreData多线程的相关:
https://www.jianshu.com/p/283e67ba12a3
iOS CoreData总结的更多相关文章
- iOS CoreData技术学习资源汇总
一.CoreData学习指引 1. 苹果官方:Core Data Programming Guide 什么是CoreData? 创建托管对象模型 初始化Core Data堆栈 提取对象 创建和修改自定 ...
- IOS CoreData 多表查询demo解析
在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...
- iOS CoreData (一) 增删改查
代码地址如下:http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系映 ...
- iOS CoreData (二) 版本升级和数据库迁移
前言:最近ChinaDaily项目需要迭代一个新版本,在这个版本中CoreData数据库模型上有新增表.实体字段的增加,那么在用户覆盖安装程序时就必须要进行CoreData数据库的版本升级和旧数据迁移 ...
- IOS CoreData 多表查询(下)
http://blog.csdn.net/fengsh998/article/details/8123392 在iOS CoreData中,多表查询上相对来说,没有SQL直观,但COREDATA的功能 ...
- iOS CoreData 介绍和使用(以及一些注意事项)
iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...
- iOS CoreData介绍和使用(以及一些注意事项)
iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...
- iOS - CoreData 数据库存储
1.CoreData 数据库 CoreData 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用 CoreData 框架,程序员可以很轻松有效地通过面向对象的接 ...
- iOS coreData问题
iOS常见错误-CoreData: Cannot load NSManagedObjectModel.nil is an illegal URL parameter 这是因为在工程中CoreData的 ...
- ios Coredata 的 rollback undo 等事物处理函数
首先说明 ios 中 NSManagedObjectContext 默认的 undoManager是nil的,就是说 undo 和 redo 都是没用的. 但是 rollback函数和reset函数是 ...
随机推荐
- 【vue3-element-admin】ESLint+Prettier+Stylelint+EditorConfig 约束和统一前端代码规范
前言 本文介绍 vue3-element-admin 如何通过ESLint 检测 JS/TS 代码.Prettier 格式化代码.Stylelint 检测 CSS/SCSS 代码和配置 EditorC ...
- Prism Sample 17-BasicRegionNavigation
本例是基础的导航应用 在窗口中布局了2个按钮,一个区域 <DockPanel LastChildFill="True"> <StackPanel Orientat ...
- Vue3 +element-plus+ wangEditor 富文本编辑器+前端七牛云上传
我用的vue3,element-plus ,没用ts 搭建wangEditor 参考 地址 https://www.cnblogs.com/xbxxf/p/16791084.html 七牛云安装参考地 ...
- #Powerquery 利用M函数合并文件(CSV、Text、Xlsx)
在日常工作中,我们往往会遇到多个文件需要合并的情况,本文一起探讨一下利用M函数合并文件的案例. 由于需要合并的文件的格式不同,也需要选择不同的M函数来进行合并,本文将分享三个格式的合并案例. 首先介绍 ...
- Nginx常用基础模块
Nginx常用基础模块 目录 Nginx常用基础模块 目录索引模块 配置方式 nginx的状态模块 配置方式 nginx访问控制模块 配置方式 nginx的访问限制模块 请求限制重定向 Nginx连接 ...
- 2020-01-16:我截获了登录token的话,是不是就获得了登录状态,这样就不安全了。如何保证安全?
福哥答案2020-01-06:[知乎答案:](https://www.zhihu.com/question/439602796)首先,Token 一般放在 Header 或者 Cookies 中,Ht ...
- 2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。 每个人的体重都一定不大于船的载重。 要求: 1, 可以1个人单独一搜船;
2021-12-01:给定一个正数数组arr,代表每个人的体重.给定一个正数limit代表船的载重,所有船都是同样的载重量. 每个人的体重都一定不大于船的载重. 要求: 1, 可以1个人单独一搜船: ...
- Vue 打包后报 Uncaught SyntaxError: Unexpected token ‘<‘
根本原因在于你的vue.config.js里的publishPath设置的路径是相对路径还是绝对路径 大家都是看别人设置成 process.env.NODE_ENV==='production' ? ...
- AI 绘画 - 如何 0 成本在线体验 AI 绘画的魅力
要想体验 AI 绘画,比较流行的三种方式是 Midjourney.OpenAI 的 DALL·E 2 以及 Stable Diffusion.而 Midjourney 已经停止免费试用,且使用价格不太 ...
- 一个.Net开发的功能强大、易于使用的流媒体服务器和管理系统
推荐一个视频管理系统,非常适合个人或者公司打造视频网站. 项目简介 这是基于.Net Core开发的,跨平台的开源项目:支持多种音视频格式,如MP3.MP4.AVI.WMV.FLV等:支持本地管理与远 ...