文档章节

iPhone开发之CoreData(实战篇)

jackyyang
 jackyyang
发布于 2012/07/29 10:04
字数 742
阅读 898
收藏 2

iPhone开发之CoreData(基础篇)中已经学习了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

完整代码

TestCoreData.zip

© 著作权归作者所有

共有 人打赏支持
jackyyang
粉丝 22
博文 42
码字总数 18506
作品 0
珠海
私信 提问
iOS:在AppDelegate中定义managed object context

关于core data 的,我之前已经做了好多小结 Core Data ---这篇介绍了core data的一些架构及基本实现; iphone开发中的数据存储:Core Data ----这篇介绍了存储四个textField的例子。从appde...

吞吞吐吐的
2017/10/10
0
0
iPhone开发之CoreData(基础篇)

通过上一篇iPhone开发之SQLite的学习,基本学会了 SQLite在iPhone中的使用,这时候我就在找有没有SQLite的封装类,这样可以避免自己重复地SQLite的封装代码,Google一下,找 到几个objc-sqli...

jackyyang
2012/07/29
0
0
干货!总结19个提升iOS开发技术的必看教程!

又到了ibnShawari一周一篇技术推送的时间了,今天我为大家带来了iOS开发篇,绝对实用,绝对简单!!! 注意!!本课程采用了一种系统且全面的方式学习:赶快来学习,体验这种方法的魔力吧!!...

视频课程
2016/01/15
0
0
iOS CoreData应用升级需要注意的地方

如果你的app运用了CoreData技术,那么在你修改了DB字段以后,再在旧版本上升级为新版本时会crash. 因为升级只升级了应用app,没有升级目录下的db文件。如果是开发当中,只需要deleate app再i...

长平狐
2012/08/13
2.5K
0
高性能Sqlite存储模型对象解密

前言 首先写这篇文章之前祝大家元旦快乐,然后自我介绍一下,我叫吴海超(WHC)在iOS领域有丰富的开发架构经验Github以后我也会以文章的形式分享具有实战意义的文章给大家,希望能够给大家有所...

WHC
2018/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

gcc -lm -lpthread 一类的理解

C代码调用math.h中的函数有问题,如sqrt函数。会出现问题(点击看问题)。 原因是调用<math.h>中的函数,编译时需要链接对应的库 libm -lm命令是使编译的时候,链接数学库; -lptread 链接线...

shzwork
32分钟前
0
0
关于360插件化Replugin Activity动态修改父类的字节码操作

近期在接入360插件化方案Replugin时,发现出现崩溃情况。 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find class "x.x.x.xActivity" on path: 我自己在插件代码......

Gemini-Lin
今天
1
0
mybatis缓存的装饰器模式

一般在开发生产中,对于新需求的实现,我们一般会有两种方式来处理,一种是直接修改已有组件的代码,另一种是使用继承方式。第一种显然会破坏已有组件的稳定性。第二种,会导致大量子类的出现...

算法之名
昨天
20
0
单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
4
0
欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部