博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iPhone开发之CoreData(实战篇)
阅读量:6000 次
发布时间:2019-06-20

本文共 3082 字,大约阅读时间需要 10 分钟。

hot3.png

中已经学习了CoreData的理论基础,是基于“Master-Detail Application”项目的代码分析,这一篇直接进入实战。

我们从“Empty Application”一个空项目开始,命名为TestCoreData,并勾选Use Core Data,在AppDelegate中Xcode已经为我们生成了CoreData基本代码。

建模

打开xcdatamodeld文件,点击Add Entity按钮添加实体,并命名这个实体为Student,如下图。

TestCoreData TestCoreData xcdatamodel

点击Add Attribute按钮(也可以点击”+”号)并添加三个属性age、name、birth,类型分别为Integer32、String、Date,如下图

TestCoreData TestCoreData xcdatamodel 1

同样地再添加一个实体为Course,并添加两个属性title、score,类型为String、Integer32。

现在Student、Course两个实体就创建好了,接下来就要把这两个实体关联起来,先看看它们之间存在什么样的关系,如下图。

coredata relationship

从上图可以看出,Student和Course之间存在一对多的关系,选择Student实体,在Relationships中添加一个courses关 联,同样在Course的Relationships中添加一个student关联,reloationship的Destination和 Inverse如下图所示

TestCoreData TestCoreData xcdatamodel 3

因为是一对多关系,所以在courses关系中要勾选“To-Many Relationship”,下图红色框选处

TestCoreData TestCoreData xcdatamodel 4

至此建模部分就完成了,我们需要Xcode为我们生成ManagedObject的子类,新建文件选择Core Data,创建基于NSManagedObject subclass,如下图

Skitched 20120218 172712

选中Student和Course这两个实体,点击Next创建

Skitched 20120218 172952

Xcode为我们生成了Student和Course的模型代码。

TestCoreData Student h

学生列表

  • ♥ 获取被管理对象上下文
  • ♥ 获取NSFetchedResultsController对象

按照这样上面的思路来写,在初始化函数中赋值managedObjectContext,获取NSFetchedResultsController对象的代码基本是模板化的代码,把上篇中的代码粘贴上去稍微改下就行了,在导航栏右边添加”+”按钮用来显示添加学生视图。

Skitched 20120220 114939

学生详细视图

该视图用来显示学生的基本信息还有课程分数,ListingStudentViewController和DetailStudentViewController之间通过成员属性student来传递变量,用UITextView来显示学生课程分数。

- (void)setupPrototypes{
lblName.text = student.name; self.title = student.name; lblAge.text = [student.age stringValue]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; lblBirth.text = [dateFormatter stringFromDate:student.birth];   NSString *strTemp = @""; for (Course *course in student.courses) {
strTemp = [strTemp stringByAppendingFormat:@"%@: %@分\r\n", course.title, course.score]; }   txtCourse.text = strTemp;}

Skitched 20120220 115252

添加学生信息

添加学生信息的流程也基本差不多,把模板代码改下

- (IBAction)createButtonPushed{
Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:managedObjectContext];  student.name = txtName.text; student.age = [[NSNumber alloc] initWithInt:[txtAge.text intValue]]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; student.birth = [dateFormatter dateFromString:txtBirth.text];   NSError *error = nil; if (![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } [self.navigationController popViewControllerAnimated:YES];}

Skitched 20120220 124405

添加课程分数

因为Xcode为我们生成了为学生添加课程的方法addCoursesObject,所以我们只要调用这个函数给学生添加课程,其它的事情由CoreData框架来处理

- (IBAction)addButtonPushed{
Course *course = [NSEntityDescription insertNewObjectForEntityForName:@"Course" inManagedObjectContext:managedObjectContext];  course.title = txtCourseName.text; course.score = [NSNumber numberWithInt:[txtCourseScore.text intValue]]; [student addCoursesObject:course];  NSError *error = nil; if (![managedObjectContext save:&error]) {
// 错误处理. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); }   [self.navigationController popViewControllerAnimated:YES];}

Skitched 20120220 125934

完整代码

转载于:https://my.oschina.net/jackyyang/blog/69674

你可能感兴趣的文章
Struts2(2)
查看>>
Android Error
查看>>
java异常分类及常见异常
查看>>
Fedora修改默认语言—中文改成英文
查看>>
代码大全阅读笔记02
查看>>
js常见事件
查看>>
个人网站访问速度慢的原因有哪些?
查看>>
性能测试初学_linux 计数器
查看>>
Java中Json对象与xml字符串互转
查看>>
Codeforces-936B Sleepy Game
查看>>
C语言程序设计第三次作业
查看>>
系统管理
查看>>
小强的HTML5移动开发之路(31)—— JavaScript回顾6
查看>>
gitlab分享项目到其它组
查看>>
JQuery基础三
查看>>
一步步学习ASP.NET MVC3 (5)——View从Action中获得数据
查看>>
for循环 添加点击事件时 出现总是加到最后一个元素上的问题
查看>>
requireJS-初识
查看>>
Android网络开发之OkHttp--基本用法POST
查看>>
English - consist of 和 compose of 的区别
查看>>