一、 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. oracle 分组后取每组第一条数据

    ‘数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, test ...

  2. Android学习之DragEvent

    关于DragEvent Google Android API中是这么说的 Represents an event that is sent out by the system at various t ...

  3. SSIS 阻塞,半阻塞和全阻塞 (Non-blocking, semi-blocking and Fully-blocking) transformations清单

    三种Blocking类型,这里跟数据流的Buff关系很大:■■ non-blocking transformations,每一行直接转换输出,没有等待.■■ partial-blocking tran ...

  4. JavaSE学习总结第18天_集合框架4

      18.01 Map集合概述和特点 Map接口概述:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值 Map接口和Collection接口的不同 1.Map是双列的,Coll ...

  5. 数组排序-Objectivec

    发表于昨天(23:33)(2013-11-03 23:33) ,已有15次阅读 ,共0个评论 摘要: 总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArr ...

  6. IT第十九天 - 继承、接口、多态、面向对象的编程思想

    IT第十九天 上午 继承 1.一般情况下,子类在继承父类时,会调用父类中的无参构造方法,即默认的构造方法:如果在父类中只写了有参的构造方法,这时如果在子类中继承时,就会出现报错,原因是子类继承父类时无 ...

  7. Debian下Apache配置多域名访问

    请见Github博客:http://wuxichen.github.io/Myblog/php/2014/10/10/DebianApacheSetting.html

  8. 移植FreeModbus+ModbusMaster+STM32至RT-Thread(3、4阶段)

    一.简介及进展 经过一个多月的努力,目前项目开发已进入最后阶段.虽然比预期时间有些延迟,但也收获不少,边工作边开源的效率确实还有待提高. 简单说下目前的进展吧 1.目前项目已经在Github中开源,大 ...

  9. SQL常用语句集合(不断更新)

    1.多条件 查询 上下级 所有数据 select * from OrgUnit where (ParentId = '3' or OrgId='3' or ParentId in (select Or ...

  10. hyper-V 装ubuntu15.04