iOS 中的数据持久化2.0-bruceyou1990

来源:互联网 发布:js radio check 编辑:程序博客网 时间:2024/04/19 19:11

最近挪了挪自己的小窝,没来得及更新博客,今天我跟小伙伴们分享一下关于iOS中的数据存储

iOS中的数据持久化方式,常用的有以下四种:
1属性列表2对象归档3 SQLite34 Core Data

数据持久化涉及的共同因素【沙盒sanbox】
每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
1. Documents:
苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录 但基于首选项的NSUserDefaults除外
2. Library:
NSUserDefaults默认设置或其它状态信息存储在Library/preferences;缓存文件存储在 Library/Caches
3. tmp:
提供一个即时创建临时文件的地方。


1. 属性列表

实现方法一

使用Xcode或者Property List Editor 应用手动编辑他们,将数组和字典包含特定序列化,就可以将NSArray或NSDicitionary写入属性列表或者在属性列表中创建

1.序列化对象:将对象转换从文字节流以便存储到文件/或传输到网络的对象
2.集合到NSArray或者NSDicitionary中
3.通过对NSArray或者NSDicitionary实例调用writToFile:atomically方法写入属性列表

[myArry writeToFile:filePath atomically:YES];

实现方法二:涉及到的主要类:NSUserDefaults,一般

**[NSUserDefaults standardUserDefaults]就够用了**@interface User : NSObject <NSCoding>@property (nonatomic, assign) NSInteger userID;@property (nonatomic, copy) NSString *name;@end使用方法1).分开存取// 存[[NSUserDefaults standardUserDefaults] setInteger:userID forKey:@”userID”];[[NSUserDefaults standardUserDefaults] setObject:name forKey:@”name”];// 取NSInteger uId = [[[NSUserDefaults standardUserDefaults] integerValueForKey:@”userID”];NSString* name = [[NSUserDefaults standardUserDefaults] stringForKey:@”name”];2).按对象存取// 存[[NSUserDefaults standardUserDefaults] setObject:self forKey:@”user”];// 取User* u = [[NSUserDefaults standardUserDefaults] objectForKey”@”user”];

2.对模型进行归档


名词解析:所谓归档就是另一种序列化的方法

只要类中实现的每个属性都是标量(如int/floa),或者遵循NSCoding协议的某各类,就可以对整个对象就行归档
NSCoding协议声明的两个方法,必须实现,一个是将对象归档到编码中另一个是对归档解码来创建一个方法:这连个方法传递一个NScoder实例
也可以使用KVC对原生的数据进行解码和编码

@interface User : NSObject <NSCoding>@property (nonatomic, assign) NSInteger userID;@property (nonatomic, copy) NSString *name;@end@implementation User// 以下两个方法一定要实现,不然在调用的时候会crash1.对对象的编码 1. (void)encodeWithCoder:(NSCoder *)aCoder; {[super encodeWithCoder:encoder];// 这里放置需要持久化的属性[aCoder encodeObject:[NSNumber numberWithInteger:self.userID] forKey:@”userID”];[aCoder encodeObject:self.name forKey:@"name"];}2.前面编码这里是解码 2. (id)initWithCoder:(NSCoder *)aDecoder{if (self = [self init]){//  这里务必和encodeWithCoder方法里面的内容一致,不然会读不到数据self.userID = [[aDecoder decodeObjectForKey:@"userID"] integerValue];self.name = [aDecoder decodeObjectForKey:@"name"];}return self;}

实现上面方法就可以基本对所有的对象的对象进行解码-编码,然后对对象进行归档。可以操作写入归档或者读取

- (void)savePerson {     // 归档:plist存储不能存储自定义对象,此时可以使用归档来完成    Person *person = [[Person alloc] init];    person.userID = 18;    person.name = @"USER";    // 获取tmp目录路径    NSString *tempPath = NSTemporaryDirectory();    // 拼接文件名    NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];    // 归档    [NSKeyedArchiver archiveRootObject:person toFile:filePath];}- (void)readPerson {    // 获取tmp      NSString *tempPath = NSTemporaryDirectory();    // 拼接文件名    NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];    // 解档    Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];    NSLog(@"%@ %d",p.name,p.userID);}

3.SQLite

iPhone自带的SQLite数据库,使用不是很友好,一般开发采用封装的封装SQLite的库

SQLite第三方封装库 FMDB github
SQLite的官方文档

FMDB有三个主要的类

1.FMDatabase
– 表示一个单独的SQLite数据库。 用来执行SQLite的命令。
2.FMResultSet
– 表示FMDatabase执行查询后结果集
3.FMDatabaseQueue
– 如果你想在多线程中执行多个查询或更新,你应该使用该类。这是线程安全的。

4.Core Data

名词解析:

Core Data是Apple提供的资料保存工具,本质上是使用SQLite保存数据,但是它不需要编写任何SQL语句。

关于Core Data一篇不错的文章

附录:

【我们还可以使用Cocoa的底层文件管理工具可以使用传统C语言的I/O口的读写 这样需要些写很多代码 所以一般不为开发者采用 所有不做介绍】

1 0
原创粉丝点击