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

                将来的gettersetter的消息实现不由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];

    // 刷选 @18NSNumber对象

//    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

posted @ 2014-03-05 18:33  回读(IOS)  阅读(383)  评论(0编辑  收藏  举报