你的位置:首页 > 操作系统

[操作系统]iOSDay37数据处理之CoreData


1. CoreData数据库框架的优势

 1> CoreData历史

  CoreData数据持久化框架是Cocoa API 的一部分,首次在iOS5版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以

  CoreData主要提供对象 --- 关系映射(ORM)功能,把OC对象转化为数据保存到文件,也可以数据转化为OC对象。

 2> CoreData数据库与Sqlite数据库的比较

  Sqlite:

  • 基于C接口,需要使用sql语句,但是代码较为繁琐

  • 在处理大量数据时,表关系更为直观

  • 在OC中不是可视化的

  • 可以跨平台使用(iOS和安卓)

  CoreData:

  • 可视化,有undo/redo能力

  • 可以实现多种文件格式NSSQLiteStoreType、NSBinaryStoreType、NSInMemoryStoreType、NSStoreType

  • 苹果官方API支持,与iOS结合更紧密

  • 不能跨平台使用,只支持iOS

 3> CoreData核心对象及关系实例(以一个餐馆为例)

  

  ② 创建实体类与属性

 

  ④ 创建实例类

    


 4> 添加对象(详解请看注释)

 1 - (void)addPerson 2 { 3   // 添加的步骤 4   // 1. 创建Person实体对象,然后开始"context",让它做好准备,将这个对象添加到数据库 5    6   /** 7    * 实例对象有两种[初始化实体对象需要借用NSEntityDescription] 8   */ 9   10   // 第一种:11 //  Person *per = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];12   // 第二种:13   // 先创建一个实体14   NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext];15   // 创建Person对象16   Person *per = [[Person alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:self.managedObjectContext];17   18   // 2. 给对象属性赋值19   per.personName = @"MBBoy";20   per.personGender = @"Unkown";21   per.personAge = @10;22 23   // 3. 将对象存入数据库24   BOOL result = [_managedObjectContext save:nil];25   26   per.personCar = carSet;27   28   // 4. 判断是否插入成功(在AppDelegate中打印地址)29   if (result) {30     NSLog(@"添加数据成功");31   } else {32     NSLog(@"添加数据失败");33   }34 }

 5> 删除对象(详解请看注释)

 1 - (void)deletePerson 2 { 3   // 1. 实体化请求类【查询】 4   NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; 5    6   // 2. 获取删除的条件(NSPredicate) 7   request.predicate = [NSPredicate predicateWithFormat:@"personName = 'MBBoy'"]; 8    9   // 3. 由context根据删除条件的请求去具体进行删除操作10   NSArray *resultArray = [self.managedObjectContext executeFetchRequest:request error:nil];11   12   // 为了代码的严密需要判断resultArray中是否有值13   if (0 == resultArray.count) {14     NSLog(@"未找到删除对象");15   } else {16     // 4. 遍历搜索出来结果17     for (Person *per in resultArray) {18       // 删除查询到相关的人的信息19       [self.managedObjectContext deleteObject:per];20     }21     22     // 5. 进行删除结果的判断,保存后删除操作才会写入文件23     BOOL result = [_managedObjectContext save:nil];24     if (result) {25       NSLog(@"删除数据成功");26     } else {27       NSLog(@"删除数据失败");28     }29   }30 }

 6> 更改对象(详解请看注释)

 1 - (void)updatePerson 2 { 3   // 1. 实体化请求类【查询】 4   NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; 5    6   // 2. 设置查询的条件 7   request.predicate = [NSPredicate predicateWithFormat:@"personName = 'MBBoy'"]; 8    9   // 3. 由context根据查询条件的请求去具体进行更新操作10   NSArray *resultArray = [self.managedObjectContext executeFetchRequest:request error:nil];11   12   // 为了代码的严密需要判断resultArray中是否有值13   if (0 == resultArray.count) {14     NSLog(@"未找到更改对象,请检查谓词条件!");15   } else {16     // 4. 遍历搜索结果17     for (Person *per in resultArray) {18       19       // 更新查询到相关的人的信息20       per.personName = @"小强";21       per.personGender = @"卵男";22       per.personAge = @38;23     }24     25     // 5. 进行删除结果的判断26     BOOL result = [_managedObjectContext save:nil];27     if (result) {28       NSLog(@"更改数据成功");29     } else {30       NSLog(@"更改数据失败");31     }32   }33 }

 7> 查询对象(详解请看注释)

 1 - (void)selectPerson 2 { 3   // 1. 实体化请求类【查询】 4   NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; 5    6   // 2. 设置查询的条件 7   request.predicate = [NSPredicate predicateWithFormat:@"personName like '*B*'"]; 8    9   // 3. 根据管理对象上下文执行相关的操作10   NSArray *resultArray = [self.managedObjectContext executeFetchRequest:request error:nil];11   12   if (0 == resultArray.count) {13     NSLog(@"未找到查询对象,请检查谓词条件!");14   } else {15     for (Person *per in resultArray) {16       NSLog(@"name = %@, gender = %@, age = %@", per.personName, per.personGender, per.personAge);17     }18   }19 }

  补: 查询结果的排序

1   // 设置排序方式2   NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"address" ascending:NO];3   request.sortDescriptors = @[sort];

4. CoreData数据库表关联操作 

 1> 添加表关系可视化操作

  Car数据库与Person数据库建立关联:

  

 2> 添加表关系代码操作

 1   // 创建Person对象 2   Person *per = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext]; 3   // 2. 给对象属性赋值 4   per.personName = @"MBBoy"; 5   per.personGender = @"Unkown"; 6   per.personAge = @10; 7    8   ///// 将车的对象通过实体描述类创建出来 9   Car *audiCar = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:self.managedObjectContext];10   11   audiCar.price = @300000;12   audiCar.color = @"白色";13   audiCar.brand = @"奥迪A7";14   15   Car *benchiCar = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:self.managedObjectContext];16   17   benchiCar.price = @500000;18   benchiCar.color = @"红色";19   benchiCar.brand = @"奔驰SUV";20   21   // 将两辆车放到集合中存储,然后进行赋值22   NSSet *carSet = [NSSet setWithObjects:audiCar, benchiCar, nil];23   24   // 3. 将对象存入数据库25   BOOL result = [_managedObjectContext save:nil];26   27   // 建立一对多关系28   per.personCar = carSet;29 30   // 4. 判断是否插入成功(在AppDelegate中打印地址)31   if (result) {32     NSLog(@"添加数据成功");33   } else {34     NSLog(@"添加数据失败");35   }

 

  补: 一对多表关系时CoreData自动生成基本操作方法

1 // 添加人与一辆车之间的关系2 - (void)addPersonCarObject:(NSManagedObject *)value;3 // 删除人与一辆车之间的关系4 - (void)removePersonCarObject:(NSManagedObject *)value;5 // 添加人与一组车之间关系6 - (void)addPersonCar:(NSSet<NSManagedObject *> *)values;7 // 删除人与一组车之间关系8 - (void)removePersonCar:(NSSet<NSManagedObject *> *)values;

  注:此处只是表间关系删除,并不会删除文件内数据

 

5. CoreData数据库数据的迁移

 1> 概述

   CoreData 支持随着App开发演进而带来的对象模型(NSManagedObjectModel)升级或修改的管理。模型的改变将导致不兼容(或不能打开)以前版本创建的存储。如果你要改变你的模型,你就必须要改变现有存储中的数据 - 即数据存储格式(store format)——这被称为数据迁移(migration)

 2> 数据迁移的三个阶段

  • 创建基于源实例对象的目标实例对象;

  

  • 重新建立联系;

去浙江的旅游团价格去浙江旅游必去景点去浙江旅游要多少钱去浙江旅游最佳路线去浙江旅游最佳时间连州地下河旅游攻略?清远连州地下河开车有多远? 连州地下河旅游景区特色?清远连州地下河好玩不? 清远连州地下河票价?连州地下河门票优惠价? 约旦印象:一半是海水一半是火焰 爱尔兰历史古迹有哪些 肯尼亚出境信息小贴士 爱尔兰值得一玩的公园有哪些 肯尼亚旅行玩什么 怡情谷漂流门票2015-5-7月惠州怡情谷漂流门票价格 5.19旅游日文笔峰门票免费吗?海南文笔峰旅游日优惠活动? 南宁龙虎山自驾游?龙虎山开车路线? 广州海洋馆旅游日优惠活动?5.19广州动物园海洋馆免费吗? 去海南旅游要买什么特产?购买时需要注意什么? 春节旅游去哪里好?适合春节旅游的景点? 三亚晚上有什么好的娱乐场所吗? 怎么去蜈支洲岛?乘车路线? 553-0008-837F Datasheet 553-0008-837F Datasheet 553-0012-801 Datasheet 553-0012-801 Datasheet 553-0012-801F Datasheet 553-0012-801F Datasheet 黑龙江到香港游线路 黑龙江到香港游线路 黑龙江到香港游线路 齐齐哈尔香港游线路 齐齐哈尔香港游线路 齐齐哈尔香港游线路 从包头去香港旅行线路 从包头去香港旅行线路 从包头去香港旅行线路