iOS数据存储

2017-03-16  本文已影响64人  名侦探_柯基

进入正题之前,先要了解iOS的>沙盒(sandbox)<

iOS沙盒目录.png

1.Documents
存放内容:程序运行时生成的一些需要长久保存的,不可再生的数据(游戏进度,应用程序个人设置等)
是否会被iTunes同步:会

2.Library
2.1.Library/Caches
存放内容:用户使用过程中的缓存文件,可再生(网络请求数据),App需要有对应的删除Caches的功能.
是否会被iTunes同步:不会

2.2Library/Preference:应用程序的偏好文件,使用>NSUserDefaults<保存的设置数据都会保存在这个文件夹下.
是否会被iTunes同步:会

3.tmp
存放内容:各种临时文件,App再次运行时主动删除,系统也会在磁盘空间不足时主动清理.
是否会被iTunes同步:不会

获取沙盒相关目录路径

获取沙盒目录

NSHomeDirectory()

获取tmp目录

NSTemporaryDirectory()

获取Documents和Library目录

NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)

这个方法用户返回指定范围内的指定目录的路径,包括三个参数:
1.directory:要搜索的目录名称,比如使用NSDocumentDirectory表明想要查找Documents目录;使用NSCachesDirectory表明想要查找Library/Caches目录

2.domainMask:指定搜索范围,比如使用NSUserDomainMask表明想要在当前应用沙盒目录下查找;NSLocalDomainMask表明想要查找/Library等.

3.expandTilde:返回一个BOOL值,表示是否展开"~"符号,返回全路径

//返回YES
"/Users/mac/Library/Developer/CoreSimulator/Devices/466710BC-3138-45F4-ADCD-FC14379107AC/data/Containers/Data/Application/EB044A4C-1454-4A12-BBB1-EF14E06C681F/Documents"
//返回NO
"~/Documents"

数据存储

plist

拼接文件路径和名称

[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"fileName.plist"];
[dataArray writeToFile:filePath atomically:YES];

第一个参数: 文件全路径
第二个参数: YES, 在写入文件的时候, 会先写入一个临时文件, 当所有数据完成写入过之后, 会把这个文件名修改为要保存的文件名, 如果写入失败, 则不修改.

[NSArray arrayWithContentsOfFile:filePath]

可以调用writeToFile的类:

可以调用WriteToFile的类.png

NSUserDefaults

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"Key"];

 [[NSUserDefaults standardUserDefaults] boolForKey:@"Key"];

UserDefaults支持的数据类型:

UserDefaults支持的数据类型.png

归档&解档

要了解归档/解档,需要先了解NSCoding协议,苹果官方给出的描述如下:

需要注意的是:所有原生的类都已经遵守了<NSSecureCoding>协议,所以可以直接归档/解档

[NSKeyedArchiver archiveRootObject:object toFile:filePath];
[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

如果是自定义类:Person

@interface Person : NSObject <NSCoding>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign)NSInteger age;
@end

想要归档/解档,除了要遵守NSCoding协议,还要在>类内部<实现两个方法:

 -(void)encodeWithCoder:(NSCoder *)aCoder {

    [aCoder encodeObject:self.name forKey:@"name"];
    
    [aCoder encodeInteger:self.age forKey:@"age"]; 
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    [aDecoder decodeObjectForKey:@"name"];
    
    [aDecoder decodeObjectForKey:@"age"];
    
    return self;
}

数据库

篇幅较大,以后专门开一篇博来分享.

最后:谢谢!

上一篇 下一篇

猜你喜欢

热点阅读