·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> iOS开发,你不得不知的数据存储---干货

iOS开发,你不得不知的数据存储---干货

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

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 *)aCoder
14 {
15     [aCoder encodeObject:self.name forKey:@"name"];
16     [aCoder encodeObject:self.phone forKey:@"phone"];
17 }
18 
19 // 遵守归档协议需调用的方法
20 - (instancetype)initWithCoder:(NSCoder *)aDecoder
21 {
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];