在面试的时候被问到 Core Data 结果答不上来的感觉很不好,于是回到家就开始补习 Core Data!以下是个人总结和代码学习过程!
什么是 Core Data
Core Data是iOS编程中使用持久化数据存储的一种方式。类似数据库存储。需要知道的是,Core Data 并不是数据库本身,是Apple提供的 对象持久化技术(Object Persistent Technology)。
Core Data 框架为数据变更管理、对象存储、对象读取恢复的功能提供了支持。它可以使用SQLite作为持久化存储的类型(但本身并不是一个数据库),它提供了 对象-关系映射(ORM) 的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。
数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型。
Core Data 的作用/好处/优点
封装。它能够自动把数据模型封装成对象(数据处理对象化),还对数据库(比如 SQLite)的操作进行了封装。
意思是,通过它,我们可以轻松地将数据库里面的数据模型转换成OC对象,也可以轻松地将OC对象保存到数据库中,变成表记录,而且不用写一条SQL语句。
这样做的好处是使代码能够精简很多。效率。它能够自动管理内存。
支持延迟写入。
支持 undo (撤销)机制。
支持多线程,但需要thread confinement的方式实现,使用了多线程之后可以最大化的防止阻塞主线程。
Core Data 的弊端/缺点
和 SQLite 不同的是:只能取出整个实体记录,然后分解,之后才能得到实体的某个属性。
Core Data因为要兼容多种后端格式,因此查询时,其可用的语句比直接使用 SQLite 少,因此有些fetch(查询操作)实际上是直接 fetch 一个 entity(实体)的所有数据然后在内存中做 filter(过滤)。不能设置数据库主键,需要手动操作。
没有批处理。批量插入、更新和删除数据都需手动写循环。
不是关系型数据库,处理多对多的关系时比较麻烦。
涉及的相关类
(1)NSManagedObjectContext(被管理的数据上下文)
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
(2)NSPersistentStoreCoordinator(持久化存储助理)
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
(3)NSManagedObjectModel(被管理的数据模型)——我理解成表数据
数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
(4)NSEntityDescription(被管理的数据记录)——我理解成表里面的单行数据
相当于数据库中的表格记录
(5)NSManagedObject(实体结构)——我理解成代码里的模型对象
相当于表格每一行封装成的对象
(6)NSFetchRequest(获取数据的请求)
相当于查询语句
理论讲到这里,下面实践出真知。
Core Data 的使用示例
新建一个 Single View Application,勾选“Use Core Data”,勾选了之后就不需要额外引入 Core Data 库了。
注意看目录结构中多了一个后缀为“.xcdatamodeld”的包
里面是.xcdatamodel文件,用数据模型编辑器编辑,编译后为.momd或.mom文件。
我们先来创建一个 Person 模型,并为它加上 name 和 age 两个属性。
接着我们可以通过便捷方式快速创建 Person 的实体结构(模型对象),通过点击 Editor - > Create NSManagedObject SubClass…然后一直 Next 到 Finish 。
然后自动生成了三个类,一个.h,一个.m,一个扩展类别里面装了 name 和 age 属性
然后我们打开AppDelegate.h,会发现多了几个属性方法
// AppDelegate.h
// TestCoreData
//
// Created by 阿曌 on 15/7/15.
// Copyright © 2015年 阿曌. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; //被管理的数据上下文
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; //被管理的数据模型
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; //持久化存储助理
- (void)saveContext; //保存更新
- (NSURL *)applicationDocumentsDirectory; //存档路径
@end
其实这个时候环境什么的都已经自动配好了,我们就不需要再搭建上下文的环境了,十分方便。
我们先来了解下存档路径,自己写打印查看。
查询
Reference:
《 Core Data入门》——MJ
《iphone数据存储之-- Core Data的使用(一)》
《iOS 的CoreData的入门资料》
《iOS 开发如果涉及数据和表的持久化,Core Data 比 SQLite 更好吗?》——知乎网友
《iOS的CoreData用法》
待耕——因为准备写新文章了,所以要先发表出来,不然草稿箱会被清掉。。。这个会耕的!~
/**
*
* ━━━━━━神兽出没━━━━━━
* ┏┓ ┏┓
* ┏┛┻━━━┛┻┓
* ┃ ┃
* ┃ ━ ┃
* ┃ ┳┛ ┗┳ ┃
* ┃ ┃
* ┃ ┻ ┃
* ┃ ┃
* ┗━┓ ┏━┛ 感觉给自己挖了个坑..
* ┃ ┃
* ┃ ┃
* ┃ ┗━━━┓
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛
*
* ━━━━━━神兽保佑,代码无bug━━━━━━
*/