一、 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. win7如何快速设置开机启动项?

    添加开机启动项方法: 找到windows开始菜单->所有程序->启动,右键打开, 进入C:\Users\Ocean\AppData\Roaming\Microsoft\Windows\St ...

  2. WebSphere优化

    优化WebSphere WebSphere里的profile刚配完,一般默认的heapsize即Xms与Xmx值只有256mb,而IBM WAS是几个J2EE服务器中最吃内存的机器,在布署一些EAR应 ...

  3. thinkphp中Conf的配置

    -----www ----------admin -------------Conf ----------admin.php ----------Home -------------Conf ---- ...

  4. Linux解压缩总结

    看文件名的后缀名,不同的后缀的文件解压和压缩的命令都不一样总结如下: *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 ta ...

  5. 初识 python

    Python 语言介绍 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python变化 python 2 和 python 3 1.1/2 等于0.5 2.print ...

  6. django中间件templates写法

    def templates_context_process(request): from django.contrib.sites.models import Site from accounts.m ...

  7. 基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms” .

    ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3 基于物品的协同过滤推荐算法--读"Item-Based ...

  8. HDU 4569Special equations2012长沙邀请赛E题(数学知识)

    Special equations Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. Send Mail 网址

    http://www.codeproject.com/Tips/371417/Send-Mail-Contact-Form-using-ASP-NET-and-Csharp http://www.c- ...

  10. PendingIntent.getBroadcast第四个参数flags

    (1) android.app.PendingIntent.FLAG_UPDATE_CURRENT 如果PendingIntent已经存在,保留它并且只替换它的extra数据. (2) android ...