CoreData多表操作.
这次给大家带来的是CoreData多表操作的使用.
首先我们要对CoreData来进行多表操作我们先要创建至少两个实体在工程中。

在创建完成这两个对应的工程实体文件和工程中的类文件后我们现在需要创建一个整体的管理文件来管理这两个文件中的对应的model文件的添加删除和修改。一般我们创建的的管理文件大多都是单例类所以我们现在来创建一个类文件继承与NSObject名字叫做CoreDataManager。

创建完成后在内部添加学生和班级的添加删除和查询的方法,一般我们创建学生时要确定学生对应的班级所以添加学生的时候需要有对应班级的参数。而创建班级时我们只需要指定好班级名称就可以。以下是这些方法的内部实现
//使用GCD创建单例
+(CoreDataManager *)shareManager
{
static CoreDataManager *manager = nil;
static dispatch_once_t queue;
dispatch_once(&queue, ^{
manager = [[CoreDataManager alloc] init];
});
return manager;
} //添加班级
-(void)addClassEntity:(NSString *)string
{
//创建班级实体的描述
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"ClassEntity" inManagedObjectContext:[kAppdelegate managedObjectContext]];
//创建班级实体
ClassEntity *classEntity = [[ClassEntity alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:[kAppdelegate managedObjectContext]];
//给班级实体的属性命名
classEntity.name = string;
//循环创建班级中对应的学生
for (int i = 0; i < 10; i++) {
//调用学生的创建方法来创建学生实体
[classEntity addStudentEntityObject:[self addStudentWithString:@"张三" class:classEntity]];
}
//保存到真实地数据库中
[kAppdelegate saveContext];
} -(StudentEntity *)addStudentWithString:(NSString *)string class:(ClassEntity *)classEntity
{
//创建学生的实体描述
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"StudentEntity" inManagedObjectContext:[kAppdelegate managedObjectContext]];
//创建学生实体
StudentEntity *student = [[StudentEntity alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:[kAppdelegate managedObjectContext]];
//给学生的实体属性赋值
student.name = string;
//给到指定的班级中
student.classEntity = classEntity;
//保存到真实的数据库中
[kAppdelegate saveContext];
//返回创建的好的学生
return student;
} //查询班级
-(NSArray *)selectClassEntity
{
//创建查询请求
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"ClassEntity"];
//获取查询结果
NSArray *arr = [[kAppdelegate managedObjectContext] executeFetchRequest:fetchRequest error:nil];
//返回结果
return arr;
} //删除班级 -(void)deleteClassEntity
{
//获取当前所有的班级
NSArray *arr = [self selectClassEntity];
//循环遍历所有的班级并删除
for (ClassEntity *classEntity in arr) {
//实体删除方法
[[kAppdelegate managedObjectContext] deleteObject:classEntity];
}
//修改真实数据库
[kAppdelegate saveContext];
} - (void)modifyClassEntity
{
//通过查询语句获取当前所有的班级
NSArray *arr = [self selectClassEntity];
//forin遍历所有的班级
for (ClassEntity *classEntyity in arr) {
//修改所有班级的名称
classEntyity.name = @"BJS166666";
}
//保存当前的修改到真实数据库中
[kAppdelegate saveContext];
} //根据班级添加学生
-(void)addStudentWithClass:(ClassEntity *)classEntity
{
//创建学生实体描述
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"StudentEntity" inManagedObjectContext:[kAppdelegate managedObjectContext]];
//创建学生实体
StudentEntity *student = [[StudentEntity alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:[kAppdelegate managedObjectContext]];
//给学生实体属性赋值
student.name = @"李四";
//指定学生实体所属的班级
student.classEntity = classEntity;
//保存到真实数据库中
[kAppdelegate saveContext];
} //根据班级查询学生
- (NSMutableArray *)selectStudentEntityWithClassEntity:(ClassEntity *)classEntity
{
//创建可变数组来存放班级中存在的学生
NSMutableArray *arr = [NSMutableArray array];
//直接通过上级传入的班级获取班级中所有的学生
for (StudentEntity *student in classEntity.studentEntity) {
//在数组中添加学生实体
[arr addObject:student];
}
//添加完成后返回存放学生的数组
return arr;
} //根据班级删除学生
-(void)deleteStudentEntityWithClassEntity:(ClassEntity *)classEntity
{
//遍历当前班级下的所有学生
for (StudentEntity *studentEntity in classEntity.studentEntity) {
//删除当前班级下的学生
[[kAppdelegate managedObjectContext] deleteObject:studentEntity];
}
//修改真实数据库中的文件
[kAppdelegate saveContext];
}
在这些文件内的方法都实现后我们就可以直接在你想要实现的控制器中去使用这些方法了
创建班级类然后在班级类的ViewDidLoad中创建添加删除和修改的按钮
- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
//创建添加班级的按钮
UIBarButtonItem *bar = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addClass)];
self.navigationItem.rightBarButtonItem = bar;
//创建删除班级的按钮
UIBarButtonItem *bar1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(deleteClass)];
self.navigationItem.leftBarButtonItem = bar1;
//获取当前所有的班级
[self selectClassEntity];
//创建修改班级的按钮
UIButton *modifyButton = [UIButton buttonWithType:UIButtonTypeSystem];
[modifyButton addTarget:self action:@selector(modifyClass) forControlEvents:UIControlEventTouchUpInside];
[modifyButton setTitle:@"修改" forState:UIControlStateNormal];
self.navigationItem.titleView = modifyButton;
}
然后再控制器中去实现对应的方法
//点击按钮添加班级
- (void)addClass
{
[[CoreDataManager shareManager] addClassEntity:[NSString stringWithFormat:@"BJS150%03d",arc4random()%100+1]];
[self selectClassEntity]; } //查询班级并刷新界面
-(void)selectClassEntity
{
self.classArr = [[CoreDataManager shareManager] selectClassEntity];
[self.tableView reloadData];
} //删除班级
- (void)deleteClass
{
[[CoreDataManager shareManager] deleteClassEntity];
[self selectClassEntity];
} //修改班级
- (void)modifyClass
{
[[CoreDataManager shareManager] modifyClassEntity];
[self selectClassEntity];
}
在查询结束后使用查询完成后的结果
//
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.classArr.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
cell.textLabel.text = [self.classArr[indexPath.row] name];
// Configure the cell...
return cell;
}
在给每个cell赋完值后我们就可以实现班级界面向学生界面的跳转了
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
SecondTableViewController *secondVC = [SecondTableViewController new];
secondVC.studentArr = [NSMutableArray array];
//读取当前班级下的所有的学生并传到下级界面
for (StudentEntity *student in [self.classArr[indexPath.row] studentEntity]) {
[secondVC.studentArr addObject:student];
}
//将当前的班级整体传到下级界面等待下级界面的操作使用
secondVC.classEntity = self.classArr[indexPath.row];
[self.navigationController pushViewController:secondVC animated:YES];
}
然后创建学生类的控制器并在ViewDidLoad中实现学生的增删改查
- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
//创建添加学生的按钮
UIBarButtonItem *bar = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addStudent)];
self.navigationItem.rightBarButtonItem = bar;
//创建删除学生的按钮
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"删除" forState:UIControlStateNormal];
[button addTarget:self action:@selector(deleteStudent) forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(0, 0, 100, 30);
self.navigationItem.titleView = button;
}
实现这些后实现每个按钮的点击事件
//添加学生
- (void)addStudent
{
[[CoreDataManager shareManager] addStudentWithClass:self.classEntity];
[self seleteStudentEntity];
}
//查询学生
- (void)seleteStudentEntity
{
self.studentArr = [[CoreDataManager shareManager] selectStudentEntityWithClassEntity:self.classEntity];
[self.tableView reloadData];
} //删除学生
- (void)deleteStudent
{
[[CoreDataManager shareManager] deleteStudentEntityWithClassEntity:self.classEntity];
[self seleteStudentEntity]; }
在查询到学生的数据后给对应的cell赋值
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.studentArr.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"cell1";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
cell.textLabel.text = [self.studentArr[indexPath.row] name];
// Configure the cell...
return cell;
}
好的在做完这几部操作后咱们对多表CoreData的操作就完成了.
CoreData多表操作.的更多相关文章
- IOS CoreData 多表查询demo解析
在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...
- CoreData 多表 关联
本文转载至 http://www.jianshu.com/p/e9f3b5e0cd19 1.概念简介 coreData中存在复杂的数据关系时,一张表难以满足需求,此时就需要了解使用coreData多表 ...
- Mysql常用表操作 | 单表查询
160905 常用表操作 1. mysql -u root -p 回车 输入密码 2. 显示数据库列表 show databases 3. 进入某数据库 use database data ...
- Sql Server系列:数据表操作
表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...
- 学习MySQL之单表操作(二)
##单表操作 ##创建表 CREATE TABLE t_employee( empno ), ename ), job ), MGR ), Hiredate DATE DEFAULT '0000-00 ...
- python——Django(ORM连表操作)
千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...
- mysql数据表操作&库操作
首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...
- SQL server基础知识(表操作、数据约束、多表链接查询)
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
- Python之Django--ORM连表操作
一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Mo ...
随机推荐
- poj 1015 Jury Compromise_dp
题意:n个陪审团,每个陪审团有x,y值,选出m个陪审团,要求 (sum(xi)-sum(yi))最少,当 (sum(xi)-sum(yi))最少有多个,取sum(xi)+sum(yi)最大那个 ,并顺 ...
- Linux —— Shell编程之变量赋值和引用
Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...
- HDU 4521 间隔》=1的LIS 线段树+dp
九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11991119 题意: n个数 d个距离 下面n个数的序列,求序列中的最长单调递增 ...
- Unity之极光推送
Android应用中大多数应用使用了推送,游戏中当然也可以使用推送!下面在Unity3D做个测试!(下面是客套话,大家可以忽略) 1.1 什么是推送技术? 推送技术,又名反向AJAX,指的是一种基于I ...
- CSS清除浮动的方法
CSS清除浮动的方法有哪些呢?经常性地会使用到float,很多邪门的事儿都有可能是浮动在作怪,清除浮动是必须要做的,而且随时性地对父级元素清除浮动的做法也被认为是书写CSS的良好习惯之一.下面看今天的 ...
- winform —— 对话框和流及打印
对话框: 注意引用using System.IO; showdialog();显示对话框,返回一个dialogresult的枚举类型 colorDialog:color属性,用来获取颜色 folde ...
- .NET Framework 4.0-RequestValidationMode
1.WebForm 先看如下 web.config 的代码: <system.web> <compilation debug="true" targetFrame ...
- oracle 11g R2安装报错ORA-00604及ORA-06553的原因及解决方法
10月31日PO主打算装oracle 11g R2,于是通过QQ旋风离线下载功能从oracle官网的链接下载了win32_11gR2_database_1of2.zip和win32_11gR2_dat ...
- Unique Binary Search Trees In JAVA
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- linux 查看目录名称的方法
1. ls -d * 2. grep查找以'/'结尾的,也就是目录 ls -F | grep '/$'