ios开发学习笔记--数据持久化之Core Data

数据持久化之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 <重点>




你可能感兴趣的:(ios开发学习笔记--数据持久化之Core Data)