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 <重点>

时间: 2024-08-29 16:58:28

ios开发学习笔记--数据持久化之Core Data的相关文章

ios开发学习笔记--数据持久化之数据库(SQLite.swift)

数据持久化之SQLite数据库(SQLite.swift使用) 一.     简介 SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了.它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快.SQLite提供的是一些C函数接口,你可以用这些函数操作数据库.通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 SQLite函数,SQLite就会为你操作数据库 一个数据库中的表就算是一个文件,一般是将这个文件放

ios学习笔记——数据持久化

一.沙盒 沙盒目录是一种数据安全策略,很多系统都采用沙盒设计. 沙盒目录设计的原理就是只能允许自己的应用程序访问目录,而不允许其他的应用访问. 1.Documents目录:该目录用于存储非常大的文件或非常频繁更新的数据,能够进行iTunes或iCloud的备份,获取目录位置的代码如下: 1 NSString * pathArr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) la

IOS开发学习笔记-(2)键盘控制,键盘类型设置,alert 对话框

一.关闭键盘,放弃第一响应者,处理思路有两种 ① 使用文本框的 Did End on Exit 绑定事件 ② UIControl on Touch 事件 都去操作 sender 的  resignFirstResponder #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField *txtUserName; @pro

IOS开发学习笔记(二)-语音识别(科大讯飞)

上次简单地讲解了如何利用科大讯飞完成语音合成,今天接着也把语音识别整理一下.当然,写代码前我们需要做的一些工作(如申请appid.导库),在上一篇语音合成的文章当中已经说过了,不了解的可以看看我上次的博文,那么这次直接从堆代码开始吧. 详细步骤: 1.导完类库之后,在工程里添加好用的头文件.在视图里只用了一个UITextField显示识别的内容,两个UIButton(一个开始监听语音,一个结束监听),然后引入类.添加代理,和语音合成的一样. MainViewController.h 1 #imp

iOS开发学习笔记:基础篇

iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境),Xcode是一个集成开发环境,包括了编辑器.调试.模拟器等等一系列方便开发和部署的工具,iOS SDK则是开发应用所必需,不同的SDK分别对应不同的iOS版本或设备,通常我们需要下载多个iOS SDK以确保我们开发的程序能够在不同版本的iOS上正常运行. 创建新工程 Xcode提供了很多种工程模

IOS开发学习笔记-(3) 进度条、等待动画开始停止

一.创建对应空间视图  ,如下图: 二.编写对应的 .h 代码,如下 : #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activWaitNetWork; @property (weak, nonatomic) IBOutlet UIProgressView *pgrsDownLo

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

IOS开发学习笔记(2)-----UIButton 详解

1. [代码][C/C++]代码     //这里创建一个圆角矩形的按钮    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    //    能够定义的button类型有以下6种,//    typedef enum {//        UIButtonTypeCustom = 0,          自定义风格//        UIButtonTypeRoundedRect,        

IOS开发学习笔记--语音合成(科大讯飞)

      现在语音服务越来越热,我们平时使用的很多软件都带有语音合成和识别功能,用起来也很方便.说到语音服务,Google和微软都提供过API接口,不过笔者要介绍的是国内的智能语音技术提供商---科大讯飞.之前看过一个比较Google.微软和科大讯飞语音识别引擎的博文(http://fqctyj.blog.163.com/blog/static/70843455201361955322797/),有兴趣可以去看看.笔者接触语音服务的时间也不长,对语音服务也不是很了解,但是拆解过科大讯飞的Dem