zoukankan      html  css  js  c++  java
  • 06-IOSCore

    一、 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

  • 相关阅读:
    14. 最长公共前缀-字符串-简单
    13. 罗马数字转整数-字符串-简单
    12. 整数转罗马数字-字符串-中等难度
    48. 旋转图像-数组-中等难度
    6. Z 字形变换-字符串-中等难度
    39. 组合总和-dfs回溯-中等难度
    【STM32F407开发板用户手册】第23章 STM32F407的USART串口基础知识和HAL库API
    【STM32F429开发板用户手册】第22章 STM32F429的SysTick实现多组软件定时器
    【STM32F407开发板用户手册】第22章 STM32F407的SysTick实现多组软件定时器
    【STM32F429开发板用户手册】第21章 STM32F429的NVIC中断分组和配置(重要)
  • 原文地址:https://www.cnblogs.com/yangmx/p/3583119.html
Copyright © 2011-2022 走看看