分类
简单来说,IOS的数据持久化有四种方式:
- 属性列表
- 对象归档
- iOS的嵌入式关系数据库SQLite3
苹果公司提供的持久化工具Core Data
下面以带有四个TextLabel的界面为例,这个界面的功能是用户在TextLabel中输入值,系统将输入的内容的保存起来,再次启动程序的时候,TextLabel默认显示的仍然是用户之前输入的值。分别用IOS数据持久化的四种方式来实现上述功能。
完成这个例子需要三步——保存label中的值就是写文件
- label显示默认值就是读文件;
- 选择相应的持久化方式,依靠这种方式进行读写。
属性列表
1 | //1.读 |
对象归档
1 |
|
SQLite3
1 | /* |
1 | //基础使用 |
1 | 程序中的读、写法 |
CoreData
概念
CoreData是水果推荐开发者使用的一种数据化持久方法,为了能够更加准确地理解,也是翻了不少前辈贡献的资料,着实收货很大
CoreData中的核心对象:
注:黑色表示类名,红色表示类里面的一个属性
1 Managed Object Model
Managed Object Model 是描述应用程序的数据模型,这个模型包含实体(Entity),特性(Property),读取请求(Fetch Request)等。(下文都使用英文术语。)
2 Managed Object ContextManaged Object Context 参与对数据对象(Managed Object)进行各种操作的全过程,并监测数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。
3 Persistent Store Coordinator
Persistent Store Coordinator 相当于数据文件管理器,处理底层的对数据文件的读取与写入。一般我们无需与它打交道。在context的操作下,负责在数据库中生成取出managed object,或者将managed Object存到数据库
4 Managed Object
Managed Object 数据对象,与 Managed Object Context 相关联。
关于Model
模型有点像数据库的表结构,里面包含 Entry, 实体又包含三种 Property:Attribute(属性),RelationShip(关系), Fetched Property(读取属性)。Model class 的名字多以 “Description” 结尾。我们可以看出:模型就是描述数据类型以及其关系的。
主要的 Model class 有:
| First Header | Second Header | Third Header |
|---|---|---|
| Managed Object Model | NSManagedObjectModel | 数据模型 |
| Entity | NSEntityDescription | 抽象数据类型,相当于数据库中的表 |
| Property | NSPropertyDescription | Entity 特性,相当于数据库表中的一列 |
| Attribute | NSAttributeDescription | 基本数值型属性(如Int16, BOOL, Date等类型的属性) |
| Relationship | NSRelationshipDescription | 属性之间的关系 |
| Fetched Property | NSFetchedPropertyDescription | 查询属性(相当于数据库中的查询语句) |
和数据库的对应关系
Manged Object <——> Database
Entity <——-> Table
Property <——-> 列 : 包含 Attribute、Relationship、Fetched Property
开发步骤总结:
- 初始化
NSManagedObjectModel对象,加载模型文件,读取app中的所有实体信息 - 初始化
NSPersistentStoreCoordinator对象,添加持久化库(这里采取SQLite数据库) - 初始化
NSManagedObjectContext对象,拿到这个上下文对象操作实体,进行CRUD操作
这几个对象用通俗的话这样理解:(并且按照下面的顺序理解)
1 . NSManagedObjectModel 确定和哪个应用连接,就是说,这个Core Data是针对哪个app设计的
1 | - (NSManagedObjectModel *)managedObjectModel |
2 . NSPersistentStoreCoordinator 字面意就是持久化存储器,所以,这个对象作用就是定位数据库,就是说,我这个应用用的是哪个数据库,But~~还要指明是哪个应用对吧,哪个应用?这在上面的self.managedObjectModel已经确定了,所以把managedObjectModel引入就可以了。
1 | - (NSPersistentStoreCoordinator *)persistentStoreCoordinator |
3 . NSManagedObjectContext 程序中负责操作数据的接口提供者,就是说,用这个对象的实例去CRUD,这之前要指明该对象的实例用的是哪个持久化存储器persistentStore
1 |
|
增删查改
1 | //插入数据 |
最后
关于几个持久化方法,有几个点需要注意一下:
- 使用 属性列表 和 归档 还需要考虑将数据存在一个文件还是多个文件中,即单文件持久化(多用)、多文件持久化;
- 在写文件是用到
[myArray writeToFile:filePath atomically:YES]第二个参数是叫数据写入辅助文件,写完后再将辅助文件复制到第一个参数指明的位置,保障写安全性; - 采用属性列表法无法序列化自定义对象,且无法序列化
NSURL,UIImage,UIColor等类; - 归档能够大多数类进行编解码来实现数据持久化,只要类中的每个属性都是标量或者遵循
NSCoding某各类的实例,都可以归档;
done!