数据持久化的几种方式

1、文件
应用程序包: 这里面存放的是应用程序的源文件,包括资源文件和可执行文件。NSString *path = [[NSBundle mainBundle] bundlePath];

Documents: 最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据。NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

Library/Caches: iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;

Library/Preferences: iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

temp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除。NSString *path = NSTemporaryDirectory();

//沙盒中创建文件
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //获取完整路径
    NSString *filePath = [path stringByAppendingPathComponent:@"citys.txt"];
    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"first",@"one","second",@"two", nil];
//写
    [dictionary writeToFile:filePath atomically:YES];
//读
NSMutableDictionary *dataDic = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

2、属性列表(plist/NSUserDefaults)
plist前面有写专门的文章说明,这里不再赘述。
NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了。他的方便之处在于不用声明太多的变量来存储不同的数据,一个NSUserDefaults就可以搞定,他是应用程序域的,能让我们进行更加方便的使用。

原理:NSUserDefaults类提供了与默认数据库相交互的编程接口。其实它存储在应用程序的一个plist文件里,路径为沙盒Document目录平级的/Library/Prefereces里。如果将默认数据库比喻为SQL数据库,那么NSUserDefaults就相当于SQL语句。

NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL,NSData

user defaults数据库中其实是由多个层级的域组成的,当你读取一个键值的数据时,NSUserDefaults从上到下透过域的层级寻找正确的值,不同的域有不同的功能,有些域是可持久的,有些域则不行。

应用域(application domain)是最重要的域,它存储着你app通过NSUserDefaults set…forKey添加的设置。
注册域(registration domain)仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。
全局域(global domain)则存储着系统的设置
语言域(language-specific domains)则包括地区、日期等
参数域(argument domain)有最高优先权
注意:

偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。

如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件

//写入
    [[NSUserDefaults standardUserDefaults] setObject:@"kobe" forKey:@"name"];
    //当然还可以setBool...forKey...  setFloat...forKey...  setInteger...forKey...等等许多自行查看
    //读取
    [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];

3、归档、解档
归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上,程序运行过程中或者再次重新打开程序的时候,可以通过解归档(返序列化)还原这些对象。只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。
注意:1、需要在定义的类中实现NSCoding协议 ,一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象
2、如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。

#import "Person.h"

@interface Person ()


@end

@implementation Person

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if ([super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntForKey:@"age"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInt:self.age forKey:@"age"];
}

@end
//归档
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"person.data"];
    Person *person = [[Person alloc] init];
    person.name = @"kitty";
    person.age = 10;
    [NSKeyedArchiver archiveRootObject:person toFile:filePath];
//解档
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"person.data"];
    Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@:%d",person.name,person.age);

4、CoreData(单独讲)
5、SQLite(单独讲)

你可能感兴趣的:(数据持久化的几种方式)