你的位置:首页 > 操作系统

[操作系统]iOS开发,你不得不知的数据存储


1、偏好设置—多用于用户名、是否自动登录等数据存储

很多iOS应用都支持偏好设置,比如保存用户名、密码、字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能

每个应用都有个NSUserDefaults实例(有切仅有一个),通过它来存取偏好设置,比如,保存用户名、字体大小、是否自动登录

(1)保存内容设置

1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 将用户名存储2 [defaults setObject:@"JFCK" forKey:@"username"];
// 将字体尺寸储存3 [defaults setFloat:18.0f forKey:@"text_size"]; 

(2)读取上次保存的设置

1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];2 // 读取username这个key的值3 NSString *username = [defaults stringForKey:@"username"];4 // 读取text_size这个key的值
5 float textSize = [defaults floatForKey:@"text_size"];
6 // 读取auto_login这个key的值
7 BOOL autoLogin = [defaults boolForKey:@"auto_login"];

(3)注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入

1 [defaults synchornize];

 

2、plist存储—字典、数组存储

(1) 数据储存:

 

    1】获取Cache文件路径:

 

    // 获取Cache文件路径

 

    // NSSearchPathDirectory:搜索的目录

 

    // NSSearchPathDomainMask:搜索范围 NSUserDomainMask:表示在用户的手机上查找

 

    // expandTilde 是否展开全路径,如果没有展开,应用的沙盒路径就是~

 

    // 存储一定要要展开路径

 

    NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

 

 

   2】拼接文件名:

 

    NSString *filePath = [cachePaht stringByAppendingPathComponent:@"Arr.plist"];

 

   3】将信息写入文件:

 

    // File:文件的全路径 

 

     [arr writeToFile:filePath atomically:YES];

 

示例:

 

 1 - (void)saver { 2   // 如何判断一个对象能不能使用Plist,就看下有没有writeToFile 3   NSArray *arr = @[@"123",@1]; 4   // 获取Cache文件路径 5   // NSSearchPathDirectory:搜索的目录 6   // NSSearchPathDomainMask:搜索范围 NSUserDomainMask:表示在用户的手机上查找 7  // expandTilde 是否展开全路径,如果没有展开,应用的沙盒路径就是~ 8  // 存储一定要要展开路径 9  NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];10  // 拼接文件名11  NSString *filePath = [cachePaht stringByAppendingPathComponent:@"Arr.plist"];12  // File:文件的全路径13   [arr writeToFile:filePath atomically:YES];14 } 

 

 

 

数据读取:

 

1 - (void)read {2  // 获取Cache文件路径3  NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];4  // 拼接文件名5  NSString *filePath = [cachePaht stringByAppendingPathComponent:@"arr.plist"];6  NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];7  NSLog(@"%@",arr);8 }

 

3、NSKeyedArchiver归档解档(NSCoding)

如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复;

不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以。

NSCoding协议有2个方法

1、encodeWithCoder:

每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量。

2、initWithCoder:

每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量。

完整实例:存取联系人的名字、电话号码信息数据:

1、在数据模型的头文件中正常定义属性和声明类方法(实例化对象的方法)

 1 #import <Foundation/Foundation.h> 2  3 @interface ICKContact : NSObject<NSCoding> 4  5 @property (nonatomic, strong) NSString *name; 6  7 @property (nonatomic, strong) NSString *phone; 8  9 + (instancetype)contactWithName:(NSString *)name andPhone:(NSString *)phone;10 11 @end

2、在数据模型的实现文件中,除了实现实例化对象的类方法以外,还需从新实现实例化对象的对象方法和存储属性的方法:

 1 #import "ICKContact.h" 2  3 @implementation ICKContact 4 // 实例化数据模型方法 5 + (instancetype)contactWithName:(NSString *)name andPhone:(NSString *)phone 6 { 7   ICKContact *contact = [[ICKContact alloc] init]; 8   contact.name = name; 9   contact.phone = phone;10   return contact;11 }12 // 遵守归档协议需调用的方法13 - (void)encodeWithCoder:(NSCoder *)aCoder14 {15   [aCoder encodeObject:self.name forKey:@"name"];16   [aCoder encodeObject:self.phone forKey:@"phone"];17 }18 19 // 遵守归档协议需调用的方法20 - (instancetype)initWithCoder:(NSCoder *)aDecoder21 {22 // super是否也实现(initWithCoder:aDecoder)方法,取决于父类super是否也遵守了NSCoding协议23   if (self = [super init]) {24     self.name = [aDecoder decodeObjectForKey:@"name"];25     self.phone = [aDecoder decodeObjectForKey:@"phone"];26   }27   return self;28 }29 30 @end

 

3、存储数据:在需要存储数据的文件中实现

1 // 获取全路径2 NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,  NSUserDomainMask, YES)[0];3 NSString *path = [cache stringByAppendingString:@"contacts.data"];4 // 以数组形式写入(底层中还是以一个一个对象的形式进行存储)5 // self.contacts :数据模型数组(此处实现就省略了)6 [NSKeyedArchiver archiveRootObject:self.contacts toFile:path];

4、获取数据:

1 NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];2 NSString *path = [cache stringByAppendingString:@"contacts.data"];3 _contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

 

       




日本旅游团报价日本旅游费用日本旅游签证深圳到日本旅游日本游报价五一长鹿农庄第二届动漫音乐节攻略?长鹿动漫音乐狂欢节有什么好玩的? 长鹿农庄五一音乐狂欢节活动有哪些?顺德长鹿农庄音乐狂欢节什么时候结束? 邢台第二届传统文化节在哪里举办?邢台张果老山传统文化节地址? 五一去长鹿农庄什么地方好玩?顺德长鹿农庄动漫音乐节什么时候? 去香港哪里买化妆品好呢? 想去澳门旅游塔蹦极?有什么需要注意的事项吗? 香港的打折季是什么时候? 2015清明节去香港玩,怎么样可以做到省钱又开心呢? 中国文化对印度有影响么? 迪拜宗教信仰是什么? 迪拜一年有哪几个季节?属于什么气候? 泰国有哪些美食?有什么特色? 2015广州鳄鱼公园三八妇女节优惠活动?广州长隆鳄鱼公园3.8女士半价时间? 2015长隆欢乐世界三八妇女节女士优惠吗?广州长隆欢乐世界3.8门票优惠活动? 2015长隆欢乐世界三八妇女节女士半价多少?广州长隆欢乐世界3.8女性门票价格? 2015长隆欢乐世界三八妇女节女士半价时间?广州长隆欢乐世界3.8女性半价几天? 12065C153KAZ2A Datasheet 12065C153KAZ2A Datasheet 0402ZJ0R5CBWTR Datasheet 0402ZJ0R5CBWTR Datasheet 1808GA150KAT1A Datasheet 1808GA150KAT1A Datasheet 梅州攻略 梅州攻略 梅州攻略 鼓浪屿旅游攻略 鼓浪屿旅游攻略 鼓浪屿旅游攻略 爱尔兰是哪个国家的 爱尔兰是哪个国家的 爱尔兰是哪个国家的