天天看点

IOS本地存储本地存储

本地存储

IOS 沙盒

:每⼀个App都有⼀个存储空间。iOS系统为每个应⽤程序创建⾃⼰的⽬录,每个应⽤程序只能访问⾃⼰的⽬录,不能相互通。

目录结构如下所示:

  • Documents: 保存应⽤运⾏时⽣成的需要持久化的数据,iTunes会⾃动备份该⽬录。苹果建议将在应⽤程序中浏览到的⽂件数据保存在该⽬录下。
  • Library:
  • Caches:⼀般存储的是缓存⽂件,例如图⽚视频等,此⽬录下的⽂件不会再应⽤程序退出时删除。在⼿机备份的时候,iTunes不会备份该⽬录。例如⾳频,视频等⽂件存放其中
  • Preferences:保存应⽤程序的所有偏好设置iOS的Settings(设置),我们不应该直接在这创建⽂件,⽽是需要通过NSUserDefault这个类来访问应⽤程序的偏好设置。iTunes会⾃动备份该⽂件⽬录下的内容。⽐如说:是否允许访问图⽚,是否允许访问地理位置…
  • tmp:临时⽂件⽬录,在程序重新运⾏的时候,和开机的时候,会清空tmp⽂件夹。

获取目录的代码

- (void)viewDidLoad {
    [super viewDidLoad];

    // 获取document目录
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [documentPaths objectAtIndex:0];

    // 获取Cache目录
    NSArray *cachePaths = NSSearchPathForDirectoriesInDomains
        (NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachePath = [cachePaths objectAtIndex:0];

    // 获取Library目录
    NSArray *libraryPaths = NSSearchPathForDirectoriesInDomains
        (NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *libraryPath = [libraryPaths objectAtIndex:0];

    // 获取Tmp目录
    NSString *tmpPath = NSTemporaryDirectory();

    _label.text = [NSString stringWithFormat:@"Document: %@\nCache: %@\nLibrary: %@\nTmp: %@", documentPath, cachePath, libraryPath, tmpPath];
}
           

文件操作

文件操作这里要用到

NSFileManager

这个类

首先要创建fileManager对象,并且判断文件是否存在

// 判断文件是否存在
NSFileManager *fileManager = [NSFileManager defaultManager];

NSString *document = NSSearchPathForDirectoriesInDomains
    (NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

NSString *filePath = [document stringByAppendingPathComponent:@"test.txt"];

if ([fileManager fileExistsAtPath:filePath]) {
    NSLog(@"test.txt exists");
}

BOOL isDirectory;
if ([fileManager fileExistsAtPath:filePath isDirectory:&isDirectory]) {

}
           

创建目录

// 创建目录
NSString *testDir = [document stringByAppendingPathComponent:@"test"];
// 存放创建失败的错误,方便后面来进行判断操作
NSError *error;

[fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:&error];

           

创建文件

// 创建文件
NSString *testTxt = [testDir stringByAppendingPathComponent:@"test.txt"];
NSData *data = [@"Hello world!" dataUsingEncoding:NSUTF8StringEncoding];
[fileManager createFileAtPath:testTxt contents:data attributes:nil];

           

删除文件

// 删除文件
[fileManager removeItemAtPath:testTxt error:nil];
           

文件读写

写文件

- (IBAction)write:(id)sender {
    // 文件父目录
    NSString *document = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
	// 文件目录
    NSString *filePath = [document stringByAppendingPathComponent:@"text.txt"];
	// 写入的内容
    NSString *contents = @"Hello world!";
    // 调用writeToFile
    [contents writeToFile:filePath atomically:YES 
     encoding:NSUTF8StringEncoding error:nil];
}
           

读文件

- (IBAction)read:(id)sender {
    // 文件父目录
    NSString *document = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
	// 文件目录
    NSString *filePath = [document 
                          stringByAppendingPathComponent:@"text.txt"];
	// 将文件内容读入字符串
    NSString *content = [NSString stringWithContentsOfFile:filePath 
                         encoding:NSUTF8StringEncoding error:nil];
    
    NSLog(@"content %@", content);
}
           

NSUserDefaults

  • NSUserDefaults⽤来存储 ⽤户设置 系统配置等⼀些⼩的数据。
    • 因为数据是明⽂存储在 plist ⽂件中,不安全,即使只是修改⼀个 key 都会 load 整个⽂件,数据多加载慢(IO 内存),不适合存储⼤量数据。
    • 它是单例的,也是线程安全的,是以键值对 key-value 的形式保存在沙盒中
    • 存储路径为:沙盒路径的Library——>Preferences⽂件夹中
  • ⽀持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、

    NSInteger、NSFloat等系统定义的数据类型,如果要存放其他数据类型或者⾃定义的对象

    (如⾃定义的类对象),则必须将其转换成NSData存储。

    • 即使对象是NSArray或NSDictionary,他们存储的类型也应该是以上范围包括的

读取代码

// read
NSInteger x = [[NSUserDefaults standardUserDefaults] 
               integerForKey:@"x"];
NSString *name = [[NSUserDefaults standardUserDefaults] 
                  stringForKey:@"name"];
NSDictionary *dict = [[NSUserDefaults standardUserDefaults] 
                      objectForKey:@"button"];
data = [[NSUserDefaults standardUserDefaults] dataForKey:@"user"];
user = [NSKeyedUnarchiver unarchivedObjectOfClass:[User class] 
        fromData:data error:nil];
           

写入代码

// save
[[NSUserDefaults standardUserDefaults] setInteger:1024 forKey:@"x"];
[[NSUserDefaults standardUserDefaults] setObject:@"Tom" forKey:@"name"];
[[NSUserDefaults standardUserDefaults] setObject:@{
    @"text": @"Cancel",
    @"color": @"#ff0000",
} forKey:@"button"];

User *user = [[User alloc] init];
user.userId = 123;
user.nickname = @"Tom";
user.isVip = YES;

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:user requiringSecureCoding:YES error:nil];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"user"];
           

继续阅读