iOS数据持久化小结

数据持久化方案一般有5种:

  • preference(偏好设置)
  • plist文件(属性列表)
  • NSKeyedArchiver(归档)
  • SQLite 3
  • CoreData

沙盒

沙盒是一个文件夹,目录结构如下:

"xxx.app"
Documents
Library
    Caches
    Preferences
tmp

使用场景

xxx.app: 这里面存放的是应用程序的源文件,包括资源文件和可执行文件
Documents: 最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据
Library/Caches: iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据
Library/Preferences: iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息
tmp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除

plist文件

plist文件是将Cocoa kit里特定的类,通过XML文件的方式保存在目录中
支持的类有:

NSArray;
NSMutableArray;

NSDictionary;
NSMutableDictionary;

NSString;
NSMutableString;

NSDate;
NSMutableData;

NSNumber;
plist文件也是储存在沙盒里,获取路径的方式:
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString *fileName = [path stringByAppendingPathComponent:@"xxx.plist"];
储存:
NSDictionary *dic = @{@"XXX":@"xxx"};
[dic writeToFile:fileName atomically:YES];
读取:
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:fileName];
注意点:

列出的类型才能使用plist文件存储。
存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。
读取时使用xxxWithContentsOfFile:方法。

Preference

1.使用方法
//1.获得NSUserDefaults文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

//2.向文件中写入内容
[userDefaults setObject:@"AAA" forKey:@"a"];
[userDefaults setBool:YES forKey:@"sex"];
[userDefaults setInteger:21 forKey:@"age"];

//2.1立即同步
[userDefaults synchronize];

//3.读取文件
NSString *name = [userDefaults objectForKey:@"a"];
BOOL sex = [userDefaults boolForKey:@"sex"];
NSInteger age = [userDefaults integerForKey:@"age"];

NSLog(@"%@, %d, %ld", name, sex, age);
2.注意

偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。
如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。
偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。

NSKeyedArchiver

@interface Student : NSObject
@property (nonatomic, strong) NSString *name; //
@property (nonatomic, strong) NSString *avatar;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, assign) BOOL hasGirlFriend;
@end


// 解档
- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    if (self) {
        
        self.name = [coder decodeObjectForKey:@"name"];
        self.avatar = [coder decodeObjectForKey:@"avatar"];
        self.age = [coder decodeIntegerForKey:@"age"];
        self.hasGirlFriend = [coder decodeBoolForKey:@"hasGirlFriend"];
    }
    return self;
}

// 归档
- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:self.name forKey:@"name"];
    [coder encodeObject:self.avatar forKey:@"avatar"];
    [coder encodeInteger:self.age forKey:@"age"];
    [coder encodeBool:self.hasGirlFriend forKey:@"hasGirlFriend"];
    
}
注意

1 必须遵循并实现NSCoding协议
2 保存文件的扩展名可以任意指定
3 继承时必须先调用父类的归档解档方法

你可能感兴趣的:(iOS数据持久化小结)