数据持久化方案一般有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 继承时必须先调用父类的归档解档方法