相关主要类:

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总结的更多相关文章

  1. iOS CoreData技术学习资源汇总

    一.CoreData学习指引 1. 苹果官方:Core Data Programming Guide 什么是CoreData? 创建托管对象模型 初始化Core Data堆栈 提取对象 创建和修改自定 ...

  2. IOS CoreData 多表查询demo解析

    在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...

  3. iOS CoreData (一) 增删改查

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

  4. iOS CoreData (二) 版本升级和数据库迁移

    前言:最近ChinaDaily项目需要迭代一个新版本,在这个版本中CoreData数据库模型上有新增表.实体字段的增加,那么在用户覆盖安装程序时就必须要进行CoreData数据库的版本升级和旧数据迁移 ...

  5. IOS CoreData 多表查询(下)

    http://blog.csdn.net/fengsh998/article/details/8123392 在iOS CoreData中,多表查询上相对来说,没有SQL直观,但COREDATA的功能 ...

  6. iOS CoreData 介绍和使用(以及一些注意事项)

    iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...

  7. iOS CoreData介绍和使用(以及一些注意事项)

    iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...

  8. iOS - CoreData 数据库存储

    1.CoreData 数据库 CoreData 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用 CoreData 框架,程序员可以很轻松有效地通过面向对象的接 ...

  9. iOS coreData问题

    iOS常见错误-CoreData: Cannot load NSManagedObjectModel.nil is an illegal URL parameter
这是因为在工程中CoreData的 ...

  10. ios Coredata 的 rollback undo 等事物处理函数

    首先说明 ios 中 NSManagedObjectContext 默认的 undoManager是nil的,就是说 undo 和 redo 都是没用的. 但是 rollback函数和reset函数是 ...

随机推荐

  1. RFS[3]: No standby redo logfiles available for thread 1

    问题描述:备库恢复DG之后,mrp进程一直是wait_for_log,主库创建数据没有正常同步,只有在切换归档的时候备库才能同步主库数据 查看主库日志,主库RFS进程提示没有可用的standby re ...

  2. CI框架调用第三方类库

    public function index() { //调用第三方类库 /* * 注意事项: * library 里面调用的名字首字母必须是 大写 * 使用它的方法时 使用小写 */ $this-&g ...

  3. Solon v2.2.10 发布,助力信创国产化

    Solon 是一个高效的 Java 应用开发框架:更快.更小.更简单.它不是 Spring.没有使用 Servlet.JavaEE 接口,是一个有自己接口标准的开放生态.可以为应用软件国产化提供支持, ...

  4. API 网关日志的价值,你了解多少?

    本文介绍了 API 网关日志的价值,并以知名网关 Apache APISIX 为例,展示如何集成 API 网关日志. 作者钱勇,API7.ai 技术工程师,Apache APISIX Committe ...

  5. 开心档之MySQL 管理

    MySQL 管理 启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysq ...

  6. 基于Canal实现MySQL 8.0 数据库数据同步

    前言 服务器说明 主机名称 操作系统 说明 192.168.11.82 Ubuntu 22.04 主库所在服务器 192.168.11.28 Oracle Linux Server 8.7 从库所在服 ...

  7. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  8. Python网络爬虫原理及实践

    作者:京东物流 田禹 1 网络爬虫 网络爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 网络爬虫相关技术和框架繁多,针对场景的不同可以选择不同的网络爬虫技术. 2 Scrapy框架( ...

  9. 2步打通ModelArts和Astro,实现AI应用快速落地

    摘要:本文以 ModelArts 的"找云宝"自动学习 AI 应用为例,结合低代码平台 Astro 轻应用快速实现一个"找云宝"小应用. 本文分享自华为云社区& ...

  10. 【Ubuntu】4.挂载/连接VM共享文件夹

    第一步 首先需要在虚拟机设置中开启共享文件夹 第二步 修改fstab文件自动挂载 如果您想要自动挂载共享文件夹,可以编辑/etc/fstab文件并添加以下内容:(二选一即可,推荐) sudo gedi ...