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).键值监听( ...
随机推荐
- json数据的获取(网络摘抄)
一个简单的对象: $.ajax({ type: "post", url: "Handler.ashx", dataType: "html", ...
- js和jQuery写简单下拉菜单
1.jQuery写法 <head> <meta http-equiv="Content-Type" content="text/html; charse ...
- STL之set和multiset(集合)
set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. constructing sets #include #include using names ...
- 分布式session
前端用户请求经过随机分发之后,可能会命中后端任意的Web Server,并且 Web Server 也可能会因为各种不确定的原因宕机.在这种情况下,session 是很难在集群间同步的,而通过将ses ...
- QQ对话代码
<li> <strong class="QQ">客服QQ</strong> <span> <a href="mqqw ...
- python学习之day9
队列queue 队列是线程安全的,它保证多线程间的数据交互的一致性. 先进先出队列Queue import queue q = queue.Queue(maxsize=3) #maxsize为队列最大 ...
- 虚拟环境管理工具virtualenvwrapper-win初试
virtualenv 用于建立虚拟目录,但是每次进入指定虚拟都必须activate, 而且如果一个环境很久没用了,不记得环境所在目录,就会遗忘该环境,virtualenvwrapper 正是解决以上问 ...
- NET Core 环境搭建和命令行CLI入门
NET Core 环境搭建和命令行CLI入门 2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文 ...
- GCC -Wall
官网:http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Warning-Options.html#Warning-Options3.8 Options to Re ...
- 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串
LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...