星空网 > 软件开发 > 操作系统

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];

 

       




原标题:iOS开发,你不得不知的数据存储

关键词:IOS

IOS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

传统付费广告成本水涨船高,如何靠联盟营销“降本增效”:https://www.kjdsnews.com/a/1603063.html
抖音不需要「带货一哥」:https://www.kjdsnews.com/a/1604052.html
董宇辉最牛带货文案:https://www.kjdsnews.com/a/1604053.html
8月海外热门广告素材盘点:https://www.kjdsnews.com/a/1604054.html
小红书“找搭子”功能解析:https://www.kjdsnews.com/a/1604055.html
@华南卖家:2024亚马逊全球开店,新手起航全覆盖!:https://www.kjdsnews.com/a/1604056.html
TikTok 将推出先买后付服务 :https://www.goluckyvip.com/news/188219.html
深圳有没有比较好玩的景点 深圳有没有比较好玩的景点推荐一下:https://www.vstour.cn/a/366175.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流