一、 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. C#中Cache用法

    C#中Cache用法     Cache 是分配在服务器上的一个公共的内存片,所谓公共指的cache只要一创建是任何一个客户端浏览器都可以通过后台代码访问到它,它面向的是所有用户,相对而言sessio ...

  2. 设计模式值六大原则——接口隔离原则 (ISP)

    接口隔离原则 Interface Segregation Principle    定义: 客户端不应该依赖它不需要的接口 类间的依赖关系应该建立在最小的接口上 我们可以把这两个定义概括为一句话:建立 ...

  3. codeforces 620E. New Year Tree dfs序+线段树+bitset

    题目链接 给一棵树, 每个节点有颜色, 两种操作, 一种是将一个节点的子树全都染色成c, 一种是查询一个节点的子树有多少个不同的颜色, c<=60. 每个节点一个bitset维护就可以. #in ...

  4. 转: sublime text 2 前端编码神器-快捷键与使用技巧介绍

    代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大.灵活的编辑器,相信你和我一样,都不会例外. 如果说 ...

  5. 2015暑假acm短训小结

    时间很快,短训已经结束,短短20天,心里有一些思绪想要记下. 收获: 从最近发的随笔中可以看出,做得最多的是搜索——Dfs,Bfs.对于搜索,如何描述状态,如何压缩状态,如何决定下一个结点,是否可以剪 ...

  6. 2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!

    鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS     Memory Limit:262144KB     64bit IO Fo ...

  7. Exam(贪心)

    Exam Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. VS插件开发——格式化变量定义语句块

    插件介绍 代码地址:https://github.com/sun2043430/vs2008_format_variable_define_plugin/ 在vs里,对选中的变量定义块进行格式化,效果 ...

  9. 如何安装系统认证签名过的APK

    如果你的App因为权限原因需要设置 android:sharedUserId="android.uid.system" 那么IDE编译出的包通常是无法直接安装的,查看控制台会发现报 ...

  10. 【IE】trim()方法失效

    今天用了$.ajax异步提交,结果在ie8里面报错了,说不支持此对象,找了半天没找到什么问题. 后来发现是我data里面的参数传递,里面有个参数用到了trim()方法,这个方法在ie8里面是失效的. ...