数据持久化之CoreDate
一. Core Data简介
Core Data是苹果公司为了实现数据持久化提供的一个框架,而不是一个数据库,提供对象—关系映射【ORM】的功能(将对象转化为数据,也能将保存在数据库的数据还原为对象)。
虽然底层操作与SQLite相似,但是并不直接写SQL语句,而且只能整个取出实体记录,然后分解之后才能得到某个属性。
Core Data能存储的类型:SQLite数据库、XML、二进制、自定义数据类型
一般情况下,Core Data的数据存在沙盒下的Document下,可以使用maseSQlite查看
Core Data关键类
NSManagedObjectModel(被管理的对象模型)
数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
NSManagedObjectContext(被管理的对象上下文)
操作实际内容(操作持久层)
作用:插入,更新,查询,删除数据
NSManagedObject(被管理的数据对象)
相当于数据库中的一条记录
NSPersistentStoreCoordinator(持久化存储协调器)
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
NSFetchRequest(获取数据的请求)
相当于数据库的查询语句
NSPredicate(谓词)
查询数据的过滤条件
NSEntityDescription(实体描述)
对实体结构的描述,用于创建对象
关键词:实体:Entity(相当于表,首字母大写) 属性:Attrubute(相当于字段,首字母小写)关联:表与表之间可以关联。
Q:如果需要存储图片附件怎么办?
A:先将附件存起来,然后存地址到数据表中
二. Core Data使用配置
要使用CoreDate必须先配置,最好是在新建工程的使用就选择Use Core Data,将省去很多配置代码,可以使用可视化配置,也可以使用代码创建。
主要步骤为:
1.创建工程时选择Use Core Data
2.新建实体(设置表属性和关联)
配置详情见::宏创学院» CoreData (一) —简介
三. CoreData具体使用
最终要的是获得上下文NSManagedObjectContext,通过它实现增删改查,实际开发中记得将数据将这些功能放在不同的函数中。
//使用CoreData func useCoreData(){ //存放数据在沙盒的document下 // 获取管理数据的上下文(在创建工程时选择使用Use Core Data才会方便实现下面代码,如果没有选择,必须代码实现配置【自行百度】) let app = UIApplication.sharedApplication().delegate as! AppDelegate let context = app.managedObjectContext // *插入 通过实体创建对象 var user = NSEntityDescription.insertNewObjectForEntityForName("Users", inManagedObjectContext: context) as! Users//为什要加as! Users?因为不加就会返回的是MamageObject // 操作对象 user.id=1 user.name = "Jom" user.age = 21 //*保存数据(完成插入) do { try context.save() }catch is NSError{ print("存储失败") } // *查询操作 var fetchRequest = NSFetchRequest(entityName: "Users")//声明实体请求(注意实体名为首大写)【fetch:取得】 //设置查询条件 fetchRequest.predicate = NSPredicate(format: "id = '1' AND name='Jom'" )//多条件查找,还可以模糊查找 let result = try! context.executeFetchRequest(fetchRequest) as! [Users]//返回值为数组,如果没有查询到就会返回空数组 //let fetchedEmployees = try context.executeFetchRequest(fetchRequest) as! [Users]//返回值为数组 这样算是全部查询吧 do{ let result = try context.executeFetchRequest(fetchRequest) as! [Users] print("数量为",result.count) ///【重要】根据这个判断是否查找到,才进行修改或删除,不让空数组操纵会出错 }catch is NSError{ print("没有查寻到") } defer{ print("查询结果为:")} //*修改(在查询的基础上,对查询到的对象进行修改,然后保存即可) if result.count==0 {print("无查询值,无法修改")}//原来为Tom //出过错,因为没有查寻到,直接对一个空数组赋值,导致程序终止,建以后这种情况判断是否为空先。 else{ print("可以修改") result[0].id=2 } do{ try context.save()//实际中应捕获异常 }catch{ print("修改失败") } //删除数据(也是在查找到的基础上,删除,在保存一次就会) if result.count==0 {print("无查询值,无法修改")}//原来为Tom //出过错,因为没有查寻到,直接对一个空数组赋值,导致程序终止,建以后这种情况判断是否为空先。 else{ print("可以删除") context.deleteObject(result[0]) } try! context.save() }
四、使用NSFetchedResultsController
在开发过程中,可能会使用CoreData在表格(table)中显示,苹果公司为了优化内存,特意设计了这个控制器,提供啊程序性能
在控制器中使用的时候一般是遵循它的NSFetchedResultsDelegate协议,导入import CoreData,以及导入实体就可以自行创建NSFetchedResultsController(类似一个方法)
详细使用请参考:http://www.starming.com/index.php?v=index&view=30
官网文档;NSFetchedResultsController Class Reference
NSFetchedResultsControllerDelegate Protect Reference
官网文档:CoreData Programming Guide
introduction to Core Data Reference Collection <重点>