iOS开发之应用数据存储的常用方式

应用沙盒:(应用的文件系统目录,应用文件夹)

每个iOS应用都有自己的应用沙盒,与其他文件系统隔离,其他应用也不能访问该沙盒。

应用沙盒的目录结构包括:应用程序包和三个文件夹 Documents、Library(Caches 和 Preference)、tmp

//获取应用沙盒
NSString *homePath = NSHomeDirectory();

应用程序包:包含了所有的资源文件和可执行文件。

Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。

//获取documents文件夹
NSString *documentsPath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。

//获取tmp文件夹
NSString *tmpPath = NSTemporaryDirectory();

Library/Caches:保存应用运行时生成的需要持久化的数据,一般存储体积大、不需要备份的非重要数据。

//获取Caches文件夹
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。


一、plist------------不能存储自定义对象

//plist的存储
     
     NSArray *arr = @[@"111", @"222"];
    
    //获取Caches文件夹
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    
    //拼接文件名
    NSString *filePath = [cachePath stringByAppendingPathComponent:@"demo.plist"];
    
    [arr writeToFile:filePath atomically:YES];
//plist的读取
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    
    //拼接文件名
    NSString *filePath = [cachePath stringByAppendingPathComponent:@"demo.plist"];
    
    NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
    
    NSLog(@"%@", arr);

二、Preference(偏好设置)-------不需要关心文件名,可以快速做键值对处理

- (IBAction)save:(id)sender {
    
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    
    [userDefault setObject:@"xx" forKey:@"account"];
    [userDefault setObject:@"11" forKey:@"password"];
    
    //iOS7之前默认不会马上把数据同步到硬盘,而是先放到缓存中
    //同步数据
    [userDefault synchronize];
}
- (IBAction)read:(id)sender {
    
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    NSString *account = [userDefault objectForKey:@"account"];
    
    NSLog(@"%@", account);
}

三、NSKeyedArchiver归档<NSCoding>-------------将自定义对象写入文件进行保存

#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>

/** 姓名 */
@property(nonatomic, strong) NSString *name;

/** 年龄 */
@property(nonatomic, assign) int *age;

@end
#import "Person.h"

@implementation Person

- (void)encodeWithCoder:(NSCoder *)aCoder {
    
    //归档自定义对象的属性
    [aCoder encodeObject:_name forKey:@"name"];
    
    [aCoder encodeInt:_age forKey:@"age"];
    
}

//解析文件时都会调用initWithCoder方法,而通过代码初始化view,调用init时底层就会调用initWithFrame方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    if (self == [super init]) {
        _name = [aDecoder decodeObjectForKey:@"name"];
        
        _age = [aDecoder decodeIntForKey:@"age"];
    }
    return self;
}

@end
- (IBAction)save:(id)sender {
    
    //归档自定义对象
    
    Person *person = [[Person alloc]init];
    person.name = @"xx";
    person.age = 18;
    
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    
    //拼接文件名
    NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.xx"];
    
    [NSKeyedArchiver archiveRootObject:person toFile:filePath];
    
}
- (IBAction)read:(id)sender {
    
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    
    //拼接文件名
    NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.xx"];
    
    //解档
    Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    
    NSLog(@"%@\n%d", p.name, p.age);
}

四、SQLite3

五、Core Data


你可能感兴趣的:(iOS开发之应用数据存储的常用方式)