相关主要类:

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. linux CentOS 7上安装Chrome浏览器

    目录 linux CentOS 7上安装Chrome浏览器 添加Chrome浏览器的官方存储库,使用以下命令: 安装Chrome浏览器: 确认Chrome浏览器是否安装成功: linux CentOS ...

  2. day29:计算机网络概念

    目录 1.网络开发的两大架构 2.网络概念 3.OSI七层模型 4.ARP协议 5.TCP三次握手和四次挥手 1.网络开发的两大架构 1.没有网络的时候,文件是如何传输的? 早期没有网络 a.py - ...

  3. lnmp中遇到open_basedir配置无效问题

    在使用LNMP包安装PHP时,发现直接修改php.ini的配置是无法生效的,其原因竟然是因为nginx的配置文件,覆盖了php.ini的配置.  ----------------------–  LN ...

  4. CI框架内置分页代码

    Controller 控制器代码 <?php defined('BASEPATH') OR exit('No direct script access allowed'); class Welc ...

  5. Go语言实现文件服务器

    主调函数,设置路由表 package main import ( "fmt" "net/http" "store/handler" ) fu ...

  6. lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】

    一.lua变量[ 全局变量和局部变量和表中的域] Lua 变量有三种类型:全局变量和局部变量和表中的域. 全局变量:默认情况下,Lua中所有的变量都是全局变量. 局部变量:使用local 显式声明在函 ...

  7. Windows安装系统

    0x01下载PE 微PE 0x02安装PE 0x021方式一:安装到系统 此方法开机有选择系统的选项,强迫症使用方法二 0x022方式二:安装到U盘 此方法需要一个U盘 确认无误后点击 立即安装到U盘 ...

  8. C# 控制系统任务栏的显示与隐藏

    [DllImport("user32.dll")] public static extern int FindWindow(string lpClassName, string l ...

  9. Velocity 不用愁!Velocity 系统的前端工程化之路

    Velocity是一个基于Java的Web页面模版引擎.十多年前,Velocity将Java代码从Web页面中分离出来,使得开发者能够并行网页开发和Java开发.随着十年前后端分离的浪潮涌动,回首再面 ...

  10. odoo开发教程十二:web controlle

    一:路由 odoo.http.route(route=None, **kw) 装饰器可以将对应方法装饰为处理对应的http请求,该方法须是Controller的子类. route -- 字符串或数组, ...