iOS应用数据存储的常用方式
-
XML属性列表(plist)归档
-
Preference(偏好设置)
-
NSKeyedArchiver归档(NSCoding)
-
SQLite3
-
Core Data
XML属性列表(plist)归档
属性列表是一种XML格式的文件,拓展名为plist。
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中。
举个例子:将一个NSDictionary对象归档到一个plist属性列表中
1
2
3
4
5
6
7
|
// 将数据封装成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@
"母鸡"
forKey:@
"name"
];
[dict setObject:@
"15013141314"
forKey:@
"phone"
];
[dict setObject:@
"27"
forKey:@
"age"
];
// 将字典持久化到Documents/stu.plist文件中
[dict writeToFile:path atomically:YES];
|
成功写入到Documents目录下:
运行结果
用文本编辑器打开,文件内容为:
文本编辑器查看
用xcode打开属性文件:
xcode查看
读取属性列表,恢复NSDictionary对象
1
2
3
4
5
|
// 读取Documents/stu.plist的内容,实例化NSDictionary
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
NSLog(@
"name:%@"
, [dict objectForKey:@
"name"
]);
NSLog(@
"phone:%@"
, [dict objectForKey:@
"phone"
]);
NSLog(@
"age:%@"
, [dict objectForKey:@
"age"
]);
|
输出结果:
属性列表-NSDictionary的存储和读取过程
Preference(偏好设置)
很多iOS应用都支持偏好设置,比如保存用户名、密码、字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能。
每个应用都有个NSUserDefaults实例,通过它来存取偏好设置。
比如,保存用户名、字体大小、是否自动登录
1
2
3
4
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@
"itcast"
forKey:@
"username"
];
[defaults setFloat:18.0f forKey:@
"text_size"
];
[defaults setBool:YES forKey:@
"auto_login"
];
|
存储文件内容
NSKeyedArchiver归档(NSCoding)
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复。
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以。
NSCoding协议有2个方法:
-
encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量
-
initWithCoder:
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量
归档一个NSArray对象到Documents/array.archive
1
2
|
NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
[NSKeyedArchiver archiveRootObject:array toFile:path];
|
归档成功
存档文件
恢复(解码)NSArray对象
1
|
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
|
存取过程
归档Person对象
Person.h
1
2
3
4
|
@interface Person : NSObject@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) float height;
@end
|
Person.m
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@implementation Person
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.name forKey:@
"name"
];
[encoder encodeInt:self.age forKey:@
"age"
];
[encoder encodeFloat:self.height forKey:@
"height"
];
}
- (id)initWithCoder:(NSCoder *)decoder {
self.name = [decoder decodeObjectForKey:@
"name"
];
self.age = [decoder decodeIntForKey:@
"age"
];
self.height = [decoder decodeFloatForKey:@
"height"
];
return
self;
}
@end
|
归档(编码)
1
2
3
4
5
|
Person *person = [[[Person alloc] init] autorelease];
person.name = @
"hosea"
;
person.age = 22;
person.height = 1.83f;
[NSKeyedArchiver archiveRootObject:person toFile:path];
|
恢复(解码)
1
|
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
|
NSKeyedArchiver-归档对象的注意
1
2
3
4
5
6
7
|
- 如果父类也遵守了NSCoding协议,请注意:
- 应该在encodeWithCoder:方法中加上一句
[
super
encodeWithCode:encode];
确保继承的实例变量也能被编码,即也能被归档
- 应该在initWithCoder:方法中加上一句
self = [
super
initWithCoder:decoder];
确保继承的实例变量也能被解码,即也能被恢复
归档NSData 使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象。 NSData可以为一些数据提供临时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容。可以使用[NSMutableData data]创建可变数据空间。
原理 举个例子:NSData-归档2个Person对象到同一文件中 归档(编码)
恢复(解码)
PS:也可将多个对象放入到一个数组中。
利用归档实现深复制 比如对一个Person对象进行深复制
深复制原理
SQLite3 SQLite3简介 SQLite3是一款开源的嵌入式关系型数据库,可移植性好、易使用、内存开销小。 SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中。比如下列的创表语句是合法的:
为了保证可读性,建议还是把字段类型加上:
SQLite3常用的5种数据类型:text、integer、float、boolean、blob 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件
导入库 创建或打开数据库
代码解析:
关闭数据库:sqlite3_close(db); 执行创表语句
代码解析:
带占位符插入数据
代码解析:
查询数据
代码解析
Core Data Core Data简单介绍
对象-关系映射
这里以Person和Card(身份证)2个实体为例子,先看看实体属性和之间的关联关系
实体属性和之间的关联关系
模型文件 创建文件
添加实体
添加Person实体的基本属性
添加Card实体的基本属性
在Person中添加card属性
在Card中添加person属性
NSManagedObject
Core Data主要对象
搭建Core Data上下文环境 从应用程序包中加载模型文件
传入模型,初始化NSPersistentStoreCoordinator
构建SQLite文件路径
添加持久化存储库,这里使用SQLite作为存储库
初始化上下文,设置persistentStoreCoordinator属性
添加数据 传入上下文,创建一个Person实体对象
设置简单属性
传入上下文,创建一个Card实体对象
设置Person和Card之间的关联关系
利用上下文对象,将数据同步到持久化存储库
查询数据 初始化一个查询请求
设置要查询的实体
设置排序(按照age降序)
设置条件过滤(name like '%hosea-1%')
执行请求
遍历数据
删除数据 传入需要删除的实体对象
将结果同步到数据库
打开Core Data的SQL日志输出开关
Core Data的延迟加载
创建NSManagedObject的子类 默认情况下,利用Core Data取出的实体都是NSManagedObject类型的,能够利用键-值对来存取数据 但是一般情况下,实体在存取数据的基础上,有时还需要添加一些业务方法来完成一些其他任务,那么就必须创建NSManagedObject的子类
选择模型文件
选择需要创建子类的实体
那么生成一个Person实体对象就应该这样写
|