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).键值监听( ...
随机推荐
- Java多线程之synchronized(一)
在上节中已经说过了“非线程安全”是如何出现的,链接如下:http://www.cnblogs.com/chentong/p/5650137.html,那么怎么解决“非线程安全”问题呢,只需要在两个线程 ...
- struct 如何存储指针类型的值
通过 __unsafe_unretained标示符标示指针类型的值,否则xcode会报以下错误(前提,你使用的是ARC模式): ARC forbids Objective-C objects in s ...
- Piggy-Bank (完全背包)
Description Before ACM can do anything, a budget must be prepared and the necessary financial supp ...
- centos7/redhat7 将网卡名字改成eth样式的方法
方法/步骤 1. 编辑 /etc/sysconfig/grub 找到“GRUB_CMDLINE_LINUX”这一行
- Ownership qualifiers of Objective-C: In Details
虽然这里讲的大部分知识以前都看过,但是时不时出现某些点让我如茅塞顿开: 以前经常会忘记一些细节,这篇文章可以更好的理解细节,巩固知识体系. Ownership qualifiers In Object ...
- 使用python操作RabbitMQ,Redis,Memcache,SQLAlchemy 其二
一.概念 1.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 ...
- Web APIs 基于令牌TOKEN验证的实现
Web APIs 基于令牌TOKEN验证的实现 概述: ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但 ...
- Trie树:应用于统计和排序
Trie树:应用于统计和排序 1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构 ...
- (3)选择元素——(4)css选择器(CSS selectors)
The jQuery library supports nearly all of the selectors included in CSS specifications 1 through 3, ...
- route-over VS mesh-under
近期在网上看到一篇专门介绍route-over和Mesh-under的论文,介绍的比較具体: ip=183.63.119.35&id=1582643&acc=ACTIVE%20SERV ...