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函数是 ...
随机推荐
- RFS[3]: No standby redo logfiles available for thread 1
问题描述:备库恢复DG之后,mrp进程一直是wait_for_log,主库创建数据没有正常同步,只有在切换归档的时候备库才能同步主库数据 查看主库日志,主库RFS进程提示没有可用的standby re ...
- CI框架调用第三方类库
public function index() { //调用第三方类库 /* * 注意事项: * library 里面调用的名字首字母必须是 大写 * 使用它的方法时 使用小写 */ $this-&g ...
- Solon v2.2.10 发布,助力信创国产化
Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.它不是 Spring.没有使用 Servlet.JavaEE 接口,是一个有自己接口标准的开放生态.可以为应用软件国产化提供支持, ...
- API 网关日志的价值,你了解多少?
本文介绍了 API 网关日志的价值,并以知名网关 Apache APISIX 为例,展示如何集成 API 网关日志. 作者钱勇,API7.ai 技术工程师,Apache APISIX Committe ...
- 开心档之MySQL 管理
MySQL 管理 启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysq ...
- 基于Canal实现MySQL 8.0 数据库数据同步
前言 服务器说明 主机名称 操作系统 说明 192.168.11.82 Ubuntu 22.04 主库所在服务器 192.168.11.28 Oracle Linux Server 8.7 从库所在服 ...
- 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
/** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...
- Python网络爬虫原理及实践
作者:京东物流 田禹 1 网络爬虫 网络爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 网络爬虫相关技术和框架繁多,针对场景的不同可以选择不同的网络爬虫技术. 2 Scrapy框架( ...
- 2步打通ModelArts和Astro,实现AI应用快速落地
摘要:本文以 ModelArts 的"找云宝"自动学习 AI 应用为例,结合低代码平台 Astro 轻应用快速实现一个"找云宝"小应用. 本文分享自华为云社区& ...
- 【Ubuntu】4.挂载/连接VM共享文件夹
第一步 首先需要在虚拟机设置中开启共享文件夹 第二步 修改fstab文件自动挂载 如果您想要自动挂载共享文件夹,可以编辑/etc/fstab文件并添加以下内容:(二选一即可,推荐) sudo gedi ...