iOS 数据存储的常用方式
2016-06-22 10:30
411 查看
OS 数据存储的常用方式
发表于2016/2/22 22:17:14 75人阅读分类: 技术随笔
一、iOS应用数据存储的常用方式
1、XML属性列表(plist)归档2、Preference(偏好设置)
3、NSKeyedArchiver归档(NSCoding)
所谓归档,是一个过程,即用某种格式来保存一个或者多个对象,以便以后还原这些对象
4、SQLite3
5、Core Data
二、数据存储
1、 pist文件读与写特点:只能存储OC常用数据类型(NSString、NSDictionary、NSArray、NSData、NSNumber等类型)而不能直接存储自定义模型对象
如果想存储自定义模型对象 -> 只能将自定义模型对象转换为字典存储;
1.1 使用须知:
前提条件:一个对象必须实现了writeToFile方法,因为我们是通过调用对象的writeToFile方法将对象写入到一个plist文件中的
// 将数组写入plist文件:(系统提供的类实现的writeToFile方法) [array writeToFile:filePath atomically:YES];1
2
plist只能识别字典,数组
1.2 读写数据 - > 实例代码
NSString *docPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)[0]; // 拼接要保存的地方的路径 NSString *filePath = [docPathstringByAppendingPathComponent:@"str.plist"]; // 1、写入数据 [array writeToFile:filePath atomically:YES]; // 2、 读取数据 NSArray *array = [NSArray arrayWithContentsOfFile:filePath];1
2
3
4
5
6
7
2、偏好设置:
每个应用都有个NSUserDefaults实例,通过它来存取偏好设置,比如,保存用户名、字体大小、是否自动登录
2.1 好处:
1.存储数据不需要关心文件名称
2.快速存储键值对
2.2 底层实现:
它其实就是一个字典
2.3 用途: 账户或者密码,开关状态
2.4 注意:设置数据时,synchornize方法强制写入
UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入
2.5 基本使用
NSUserDefaults *UserDefaults = [NSUserDefaultsstandardUserDefaults]; // 1、写入 [UserDefaults setBool:NO forKey:@"isLogined"]; // 强制写入 [defaults synchornize]; // 2、读取 BOOL isVisble = [UserDefaults boolForKey:@"isLogined"];1
2
3
4
5
6
7
8
3、获取临时文件夹路径
// 3.1 获取临时文件夹路径 NSString *tmp = NSTemporaryDirectory(); // 3.2 定义宏,快速访问临时文件夹中文件 #define FilePath [NSTemporaryDirectory() stringByAppendingPathComponent:@"person.data"]1
2
3
4
4、归档 NSKeyedArchiver
特点:
1.可以存储自定义模型对象
NSKeyedArchiver归档相对较plist存储而言,它可以直接存储自定义模型对象,而plist文件需要将模型转为字典才可以存储自定义对象模型;
2.归档不能存储大批量数据(相比较Sqlite而言),存储数据到文件是将所有的数据一下子存储到文件中,从文件中读取数据也是一下子读取所有的数据;
缺点:
假如你的文件中有100个对象了,然后你想在利用归档添加一个对象,你需要先把所有的数据解档出来,然后再加入你想添加的那个对象,同理,你想删除一个文件中的一个对象也是,需要解档出所有的对象,然后将其删除。性能低这样处理
4.1 基本使用:需要归档的模型类必须要遵守NSCoding协议,然后模型实现类中必须实现两个方法:
1>encodeWithCoder -> 归档;
2> initWithCoder: - > 解档
4.2 使用注意:
如果父类也遵守了NSCoding协议,请注意:
应该在encodeWithCoder:方法中加上一句 [super encodeWithCode:encode]; // 确保继承的实例变量也能被编码,即也能被归档 应该在initWithCoder:方法中加上一句 self = [super initWithCoder:decoder]; // 确保继承的实例变量也能被解码,即也能被恢复1
2
3
4
5
6
7
基本使用
// 1. 自定义模型类Person // 1.1 Person.h文件 #import <Foundation/Foundation.h> // 只要一个自定义对象想要归档,必须要遵守NSCoding协议,并且要实现协议的方法 @interface Person : NSObject<NSCoding> @property (nonatomic, assign) int age; @property (nonatomic, strong) NSString *name; @end // 1.2 .m实现文件 #import "Person.h" #define KName @"name" #define KAge @"age" @implementation Person // 什么时候调用:当一个对象要归档的时候就会调用这个方法归档 // 作用:告诉苹果当前对象中哪些属性需要归档 - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_name forKey:KName]; [aCoder encodeInt:_age forKey:KAge]; } // 什么时候调用:当一个对象要解档的时候就会调用这个方法解档 // 作用:告诉苹果当前对象中哪些属性需要解档 // initWithCoder什么时候调用:只要解析一个文件的时候就会调用 - (id)initWithCoder:(NSCoder *)aDecoder { #warning [super initWithCoder] if (self = [super init]) { // 解档 // 注意一定要记得给成员属性赋值 _name = [aDecoder decodeObjectForKey:KName]; _age = [aDecoder decodeIntForKey:KAge]; } return self; } @end // 2. 实例 -》基本使用:取 / 存 数据 // 归档 [NSKeyedArchiver archiveRootObject: self.persons toFile:KFilePath];// 将self.persons模型对象数组 // 解档 _persons = [NSKeyedUnarchiver unarchiveObjectWithFile:KFilePath];1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
5、SQLite3
它是一款开源的嵌入式关系型数据库,可移植性好、易使用、内存开销小
特点:可以存储大量数据
详情,请参见 【SQLite3篇】
6、Core Data
Core Data框架提供了对象-关系映射(ORM)的功能,
即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。
在此数据操作期间,不需要编写任何SQL语句。
使用此功能,要添加CoreData.framework和导入主头文件
<CoreData/CoreData.h>
详情,请参见【Core Data篇】,待续
相关文章推荐
- iOS 持续集成- Mac下命令启动和关闭Jenkins
- iOS 时间戳转化为时间
- iOS 把当前时间转化为时间戳
- iOS真机调试问题The certificate has either expired or has been revoked
- CocoaPods 使用时候的问题
- IOS应用内跳转系统设置相关界面的方法
- iOS通过html模版实现富文本编辑
- ios 动画学习的套路 (二)
- IOS热更新-JSPatch实现原理+Patch现场恢复
- JSBridge(Android和IOS平台)的设计和实现
- 转场动画
- 不容错过的iOS 8的导航交互
- 安装测试版ios10和xcode8.0beta(8S128d)
- ios加载第三方库:横竖屏切换错误
- iOS开发——SiriKit应用
- iOS开发人员需要了解的苹果开发者账号与邓白氏编码
- iOS开发实战——摄像头与相册权限获取逻辑优化
- iOS开发--AVFoundation自定义相机
- 『零行代码』解决键盘遮挡问题(iOS)
- iOS Quartz2D基本图形绘制