iOS数据持久化

#数据持久化 ##一、文件管理 ###1.1iOS沙盒机制:
iOS应⽤用程序只能在为该改程序建立的文件系统中读取文件,不能够去其它地方访问,此区域被成为沙盒,因此全部的非代码⽂件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件 等。
• 每一个应⽤程序都有⾃己的存储空间
• 应⽤程序不能翻过自⼰的围墙去访问别的存储空间的内容
• 应用程序请求的数据都要经过权限检测,假如不符合条件的话,不会被放行。git

输入图片说明

经过这张图只能从表层上理解sandbox是一种安全体系,应⽤程序的全部操做都要经过这个体系来执行,其中核心内容是:sandbox对应⽤程序执行各类操做的权限限制。github

  • 应用沙盒路径
// 沙盒目录路径
   NSString *homePath =  NSHomeDirectory();

   // Documents 目录
   NSString *documentsPath = [homePath stringByAppendingPathComponent:@"Documents"];

###1.2目录结构: 默认状况下,每一个沙盒含有3个⽂件夹:Documents, Library 和 tmp。由于应⽤用的沙盒机制,应⽤只能在⼏个目录下读写文件数组

输入图片说明

  • Documents:苹果建议将程序中建⽴的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢 复的时候会包括此目录
// 获取Documents目录
- (NSString *)docPath {
    
    /** NSSearchPathForDirectoriesInDomains: 获取文件目录路径
     
     参数一: 要获取的目录名称
     参数二: 要查找的目录的主目录(沙盒目录)
     参数三: 是否返回完整的路径
     **/
    
   return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
  • Library:存储程序的默认设置或其它状态信息;(iTunes备份和恢复的时候会包含此目录)
// 获取 Library目录
- (NSString *)libPath {
    
    return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
}
  • Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
// 获取缓存目录路径
- (NSString *)cachesPath {
    
    return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}
  • tmp:提供一个即时建立临时⽂件的地⽅方。(系统重启后会删除tmp里的全部文件)
// 获取Tem目录
- (NSString *)temPath {
    
    return NSTemporaryDirectory();
}

###1.3文件操做:缓存

  1. 获取程序的Home路径
  2. 获取Documents路径
  3. 获取Library路径
  4. 获取缓存路径
  5. 获取tmp路径
  6. ⽂件写入
  7. ⽂件读取
  8. 删除文件

###1.4沙盒目录代码下载 沙盒目录代码下载安全


##二、属性列表 概述:
使⽤属性列表持久化数据对象很是⽅便,只要是数组或者字典中包含的对象是特定的
可序列话对象(包括NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData, NSMutableData,NSString,NSMutableString,NSNumber,NSDate),就能够直接经过NSDictionaryNSArray的实例⽅法将其保存到属性列表或者从属性列表中读取他们。编码

示列代码atom

NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [docPath stringByAppendingPathComponent:@"userInfo.plist"];
     
    NSMutableDictionary *userInfos = [NSMutableDictionary dictionary];
    [userInfos setObject:@"admin" forKey:@"userName"];
    [userInfos setObject:@"55244646435@qq.com" forKey:@"email"];`

一、将字典数据写入plist文件code

BOOL isSuccess_1 = [userInfos writeToFile:filePath atomically:YES];
    
    
    NSString *filePath_array = [docPath stringByAppendingPathComponent:@"i"];
    NSArray *infos = @[@"1",@"2",@"3"];

二、将数组数据写入plist文件对象

BOOL isSuccess_2 =  [infos writeToFile:filePath_array atomically:YES];
    
    if (isSuccess_2) {
        NSLog(@"数据写入成功");
    } else {
        
        NSLog(@"写入失败");
    }

三、获取本地路径的plist文件图片

NSArray *infos_ = [NSArray arrayWithContentsOfFile:filePath_array];
// NSDictionary *userInfos = [NSDictionarydictionaryWithContentsOfFile:filePath];

NSUserDefaults 系统提供的plist文件

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

设值

[userDefaults setObject:@100 forKey:@"id"];
    [userDefaults setBool:YES forKey:@"isLoad"];
    [userDefaults setDouble:3.8408 forKey:@"price"];

同步数据代码

[deaults synchronize];

取值

id value = [userDefaults objectForKey:@"id"];
    NSLog(@"%@",value);

修改

[userDefaults setObject:@2000 forKey:@"id"];
    [userDefaults synchronize];

###2.1属性设置代码下载

数据持久化属性设置代码


##三、对象归档
概述:
对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使⽤的 时候读取该文件的保存路径读取文件的内容(也称为接档,反序列化), (对象归档的文件是保密的,在磁盘上⽆法查看文件中的内容,⽽属性列表是明⽂的,可 以查看)。

###3.1对象归档⽅方式:

  1. 简单归档
  2. 对多个对象进⾏行归档
  3. 对⾃自定义对象进⾏行归档

一、使用 NSKeyedArchiver 进行编码归档

//一、建立文件保存路径
  NSString *dicPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  NSString *filePath = [dicPath stringByAppendingPathComponent:@"data.archive"];

  //二、设置保存的数据
  NSMutableArray *infos = [NSMutableArray array];
  [infos addObject:@"One"];
  [infos addObject:@100];
  [infos addObject:[NSDate date]];

  //三、将数据归档到指定路径
  [NSKeyedArchiver archiveRootObject:infos toFile:filePath];

二、解归档(读取解码): NSKeyedUnarchiver

id object = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    User *user_ = (User *)object;
    NSLog(@"%@  %@",user_.userName, user_.password);

###3.2 自定义对象归档 有时候咱们须要本地保存本身定义的一些对象数据,这些对象并无实现<NSCoding>协议,因此在归档数据前要先去实现<NSCoding>协议中的方法,在协议方法中对自定义对象属性的编码和解码。以下实现自定义的User类对象的归档:

.h中设置属性并实现<NSCoding>协议

@interface User : NSObject <NSCoding>

@property (nonatomic, copy) NSString *userName;
@property (nonatomic, copy) NSString *password;

@end

对属性编码和解码

.m文件中实现协议方法,encodeWithCoder: 和 initWithCoder:完成对属性数据的编码和解码。

// 编码
- (void)encodeWithCoder:(NSCoder *)aCoder {
    
    [aCoder encodeObject:_userName forKey:@"userName"];
    [aCoder encodeObject:_password forKey:@"password"];
}


// 解码
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    self = [super init];
    if (self ) {
        
        self.userName = [aDecoder decodeObjectForKey:@"userName"];
        self.password = [aDecoder decodeObjectForKey:@"password"];
    }
    
    return self;
}



@end

###3.3对象归档代码下载

对象归档代码下载

相关文章
相关标签/搜索