一、 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的更多相关文章

  1. IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

    IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...

  2. 使用Bootstrap 3开发响应式网站实践06,使用ListGroup、Thumbnails展示内容

    □ ListGroup展示内容 当希望把同类型的内容以列表.区块展示的时候,ListGroup是不错的选择. <div class="col-sm-6"> <h3 ...

  3. Objective-C之KVC、KVO

    1,KVC(键值编码)  Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进 ...

  4. iOS开发系列--Objective-C之KVC、KVO

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

  5. 07OC之KVC、KVO

    在OC中,有着很多动态的特性,今天我们着重讲讲OC中的键值编码(KVC)和键值监听(KVO)特性. 一.键值编码(KVC) 在C#中,我们可以通过反射的方式动态去读写一个对象,有时候很方便,因为可以利 ...

  6. KVC、KVO、NSNotification、delegate 总结及区别

    1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...

  7. iOS开发系列--Objective-C 之 KVC、KVO

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

  8. iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b

    1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...

  9. KVC、KVO

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

随机推荐

  1. 碰撞缓冲效果的导航条 js

  2. 查看Oracle数据库某用户的连接信息

    执行以下语句可查出用户TJAMIS_LXF连接信息: select schemaname, osuser, process, machine, port, terminal, program from ...

  3. git 删除右键菜单

    cmd进入"C:\Program Files (x86)\Git\git-cheetah"目录,运行regsvr32 /u git_shell_ext(64).dll

  4. known good die( KGD) /确认好裸芯片,合格芯片

    英文:known good die( KGD) / 中文:确认好裸芯片,合格芯片 完工的晶圆上有许多晶片存在,其单一品质有好有坏,经过老化试验后,其确知电性能良好的晶片即称为己知好晶片.不过,已知好晶 ...

  5. Android项目增加混淆

    主要介绍向Android项目中添加混淆功能 增加混淆的原因 提高安全性,增加反编译的难度 减少APK的文件大小 实践 混淆的配置 一般情况下,app module 的 build.gradle 文件默 ...

  6. perl学习(3) 列表

      列表或称为数组,和c语言中的数据类似,只是perl自己特殊的一些写法. 1.1.定义 一个列表或者数组可以包含数字,字符串,undef 值,或者任意不同类型的标量值的组合,但是这些元素的类型通常是 ...

  7. uvalive 3971 - Assemble(二分搜索 + 贪心)

    题目连接:3971 - Assemble 题目大意:有若干个零件, 每个零件给出的信息有种类, 名称, 价格, 质量,  现在给出一个金额, 要求在这个金额范围内, 将每个种类零件都买一个, 并且尽量 ...

  8. IT第十天 - String和StringBuffer的比较、编程设计技巧整理、本周总结 ★★★

    IT第十天 上午 String 1.String在进行多次的+扩展时,会严重的降低处理效率,因为String长度是不可变的,在进行+运算改变字符串时,会自动创建很多临时字符串,并不是在原字符串上追加, ...

  9. Deep Learning论文笔记之(六)Multi-Stage多级架构分析

    Deep Learning论文笔记之(六)Multi-Stage多级架构分析 zouxy09@qq.com http://blog.csdn.net/zouxy09          自己平时看了一些 ...

  10. QQ邮箱添加公司邮箱步骤

    经领导提示,发现QQ邮箱可以添加公司邮箱.这样,在有同事出差在外的时候,可以通过QQWEB邮箱,即可收发公司邮箱,不必安装邮箱客户端软件. 仅供各位同事参考使用. 1.打开QQ邮箱 2.点击其他邮箱, ...