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).键值监听( ...
随机推荐
- DevExpress ASP.NET 使用经验谈(2)-XPO对象的使用(使用默认数据连接)
接下来,我们通过一个控制台应用程序,介绍XPO对象的保存操作. 图一 添加新项目 图二 选择项目类型为控制台应用程序 查看生成的Program.cs代码文件,代码如下: using System; u ...
- linkbutton.js
jquery.linkbutton.js /** * linkbutton - jQuery EasyUI * * Licensed under the GPL: * http://www.gnu.o ...
- 关于android的坑
坑1: 使用SQLiteOpenHelper的时候如果建立的表中存在不为空的字段,但是用ContentValues()的方式来插入数据的话恰好没有往这个字段里插入数据,那么执行后市没法往数据库里插入数 ...
- 2013 南京邀请赛 C count the carries
/** 大意: 给定区间(a,b), 将其转化为二进制 计算从a+(a+1)+(a+2)....+(a+b-1),一共有多少次进位 思路: 将(a,b)区间内的数,转化为二进制后,看其每一位一共有多少 ...
- 转:JavaScript定时机制、以及浏览器渲染机制 浅谈
昨晚,朋友拿了一道题问我: a.onclick = function(){ setTimeout(function() { //do something ... },0); }; //~~~ 我只知道 ...
- HttpGet()和HttpPost()
转 http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,P ...
- java学习之观察者设计模式
package com.gh.observer; import java.util.Observable; /** * 被观察者对象 * 必须继承被观察者抽象类 * @author ganhang * ...
- 史上最全然oophper php文件上传之文件类型相应表,ie,火狐各一份。
ie 火狐 id 后缀名 php识别出的文件类型 0 gif image/gif 1 jpg image/jpeg 2 png image/png 3 bmp image/bmp 4 psd appl ...
- [置顶] NGINX原理分析之SLAB分配机制
一.基础概述 如果使用伙伴系统分配和释放算法,不仅会造成大量的内存碎片,同时处理效率也比较低.SLAB是一种内存管理机制,其核心思想是预分配.SLAB是将空间按照SIZE对内存进行分类管理的,当申请一 ...
- 【Java线程】锁机制:synchronized、Lock、Condition
http://www.infoq.com/cn/articles/java-memory-model-5 深入理解Java内存模型(五)——锁 http://www.ibm.com/develope ...