06-IOSCore - KVC、CoreData
一、 KVC
1. KVC
使用前:黯淡无光
if ([keyPath isEqualToString:@"name"]) {
self.labelName.text = self.person.name;
}elseif ([keyPath isEqualToString:@"level"]){
self.labelLevel.text = self.person.level;
self.progressViewLabel.progress = [self.person.levelfloatValue]/6.0;
}
使用后:
NSDictionary *labelMap = @{@"name": self.labelName,@"lavel":self.labelLevel};
[labelMap[keyPath] setText:[self.personvalueForKeyPath:keyPath]];
2. Key / KeyPath
Key: 你只能KVC 某个对象的直接属性
KeyPath:你可以KVC 对象的属性的属性的属性的.....
3. KVC 什么时候用
1) 配合KVO使用
2) 当你发现如下代码特别多的时候可以使用
self.person.name = node[@"name"];
self.person.phoneNumber = node[@"phoneNumber"];
self.person.resume = node[@"resume"];
self.person.p2 = node[@"p2"];
for(NSString * attribute in node){
[self.person setValue:node[attribute] forKeyPath:attribute];
}
4. KVC 和其它技术融合
Data Binding 数据绑定
self.label
self.person
[self.label bindObject:self.person forKey:@"name"];
二、 Core Data
1. 是什么?
苹果自己使用的数据框架
java: Hibernate
.net: Entity Framework
2. 优势/劣势
优势:处理大型数据模型
劣势:
1. 操作复杂
2. 存储的数据不能跨平台,
只能在iOS以及Mac OS X平台下使用
3. 怎么使用?
1) 创建一个支持Core Data的项目(空项目)
2) 在 Core Data 内增加实体
对比:
nib:
每增加一个界面 就要增加一个xib文件
storyborad:
每增加一个界面 在storyboard中拖拽一个场景
对比:
以前:
每增加一个数据模型 就要创建一个实体类
使用coredata之后:
每增加一个数据模型 在coredata内拖拽一个实体(add entity)添加属性(addAttribute)
3) 生成实体类(选中实体选择editor->creatNSManager...)
1> 生成的类都是继承NSManagedObject
继承这个类是为了协助CoreData管理这个对象
2> 生成的类的.m文件中有
@dynamic
将来的getter和setter的消息实现不由oc语法协助生成
而由其它(CoreData)机制负责生成
3> 生成的类不要勾选options
生成的基础类型都将变为包装类
注意:更改了coreData内的数据后需要重新生成实体类,并在模拟器中kill掉该应用程序。
4) 使用NSManagedObjectContext对数据进行操作
5) 在合适的时候保存
4. 基本操作
1) 增加数据
1> 获取MOC
2> 在MOC中创建对象
3> 利用新对象地址修改对象属性
// 创建模型单例对象ManagedObjectContext
MXAppDelegate *appDelegate = [[UIApplicationsharedApplication] delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext;
// 创建实体对象 放入ManagedObjectContext
MXContact *contact = [NSEntityDescriptioninsertNewObjectForEntityForName:@"MXContact"inManagedObjectContext:context];
contact.name = self.textFieldName.text;
contact.age = @([self.textFieldAge.textintValue]);
contact.phoneNumber = self.textFieldPnoneNumber.text;
contact.group = self.group; // 增加实体关联
2) 查询数据
1> 获取MOC
2> 创建查询对象
3> 让MOC执行查询
5. 高级查询
1) 可以构建排序器
2) 可以构建筛选器
MXAppDelegate *appDelegate = [[UIApplicationsharedApplication] delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext;
// 创建查询
NSFetchRequest *request = [NSFetchRequestfetchRequestWithEntityName:@"MXContact"];
// 排序描述器按姓名排序 升序
NSSortDescriptor *sortDescriptor = [NSSortDescriptorsortDescriptorWithKey:@"name"ascending:YES];
request.sortDescriptors = @[sortDescriptor];
// 刷选 @18是NSNumber对象
// NSString *str = @"18"; // 这里可以从文本框中获取
// NSNumber *number = @([str intValue]); // @()把一个数字转为NSNumber对象
//// request.predicate = [NSPredicate predicateWithFormat:@"age>=%@",@18];
// request.predicate = [NSPredicate predicateWithFormat:@"age>=%@",number];
request.predicate = [NSPredicatepredicateWithFormat:@"group.name==%@",self.group.name];
// 如果不排序会返回一个无序的数组
self.contacts = [[context executeFetchRequest:request error:nil] mutableCopy];
6. 改/查
1) 修改对象
1> 拿到对象直接修改属性
2) 删除对象有3步
// 1.删掉模型层的对象 M层
MXAppDelegate *appDelegate = [[UIApplicationsharedApplication] delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext;
[context deleteObject:self.contacts[indexPath.row]];
// 2.删除掉数组中的对象 C层
[self.contactsremoveObject:self.contacts[indexPath.row]];
// 3.从界面中移除 V层
[tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationTop];
7. 单实体注意事项
1) 实体名称和类名可以不一样(实体名称最好不要改)
2) 如果给实体增加消息,必须使用Category语法
8. 多实体关联
1) 什么是?
多个数据对象之间的关系 (包含)
2) 关联的种类
方向
1> 双向关联
2> 单向关联
数量
1> To One 对一
2> To Many 对多
一对一 情侣
-> To One
<- To One
一对多 班级 学员
-> To Many
<- To One
多对多 微博 博主
-> To Many
-> To Many
3) 操作
contact.group = .....
//赋值的对象必须已经在MOC中
//而且必须在和contact同样所属的MOC
9. Core Data 初始化数据
必须使用UserDefaults
作业
0. 复习代码
1. **** 你可以把TMessage 或者 TMusic 升级为Core Data
2. TRContact 跑通
查询 / 添加 必须理解
3. TMusic 必须完整
MusicsViewController
PlayingViewController
PlayingListViewController
06-IOSCore - KVC、CoreData的更多相关文章
- IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...
- 使用Bootstrap 3开发响应式网站实践06,使用ListGroup、Thumbnails展示内容
□ ListGroup展示内容 当希望把同类型的内容以列表.区块展示的时候,ListGroup是不错的选择. <div class="col-sm-6"> <h3 ...
- Objective-C之KVC、KVO
1,KVC(键值编码) Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进 ...
- iOS开发系列--Objective-C之KVC、KVO
概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...
- 07OC之KVC、KVO
在OC中,有着很多动态的特性,今天我们着重讲讲OC中的键值编码(KVC)和键值监听(KVO)特性. 一.键值编码(KVC) 在C#中,我们可以通过反射的方式动态去读写一个对象,有时候很方便,因为可以利 ...
- KVC、KVO、NSNotification、delegate 总结及区别
1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...
- iOS开发系列--Objective-C 之 KVC、KVO
概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...
- iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b
1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...
- KVC、KVO
概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...
随机推荐
- 碰撞缓冲效果的导航条 js
- 查看Oracle数据库某用户的连接信息
执行以下语句可查出用户TJAMIS_LXF连接信息: select schemaname, osuser, process, machine, port, terminal, program from ...
- git 删除右键菜单
cmd进入"C:\Program Files (x86)\Git\git-cheetah"目录,运行regsvr32 /u git_shell_ext(64).dll
- known good die( KGD) /确认好裸芯片,合格芯片
英文:known good die( KGD) / 中文:确认好裸芯片,合格芯片 完工的晶圆上有许多晶片存在,其单一品质有好有坏,经过老化试验后,其确知电性能良好的晶片即称为己知好晶片.不过,已知好晶 ...
- Android项目增加混淆
主要介绍向Android项目中添加混淆功能 增加混淆的原因 提高安全性,增加反编译的难度 减少APK的文件大小 实践 混淆的配置 一般情况下,app module 的 build.gradle 文件默 ...
- perl学习(3) 列表
列表或称为数组,和c语言中的数据类似,只是perl自己特殊的一些写法. 1.1.定义 一个列表或者数组可以包含数字,字符串,undef 值,或者任意不同类型的标量值的组合,但是这些元素的类型通常是 ...
- uvalive 3971 - Assemble(二分搜索 + 贪心)
题目连接:3971 - Assemble 题目大意:有若干个零件, 每个零件给出的信息有种类, 名称, 价格, 质量, 现在给出一个金额, 要求在这个金额范围内, 将每个种类零件都买一个, 并且尽量 ...
- IT第十天 - String和StringBuffer的比较、编程设计技巧整理、本周总结 ★★★
IT第十天 上午 String 1.String在进行多次的+扩展时,会严重的降低处理效率,因为String长度是不可变的,在进行+运算改变字符串时,会自动创建很多临时字符串,并不是在原字符串上追加, ...
- Deep Learning论文笔记之(六)Multi-Stage多级架构分析
Deep Learning论文笔记之(六)Multi-Stage多级架构分析 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些 ...
- QQ邮箱添加公司邮箱步骤
经领导提示,发现QQ邮箱可以添加公司邮箱.这样,在有同事出差在外的时候,可以通过QQWEB邮箱,即可收发公司邮箱,不必安装邮箱客户端软件. 仅供各位同事参考使用. 1.打开QQ邮箱 2.点击其他邮箱, ...