什么是数据持久化存储?
所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。
什么是沙盒机制?
iOS程序默认情况下只能访问程序自己的目录,这个目录被称为“沙盒”。目录结构如下:
"应用程序包":这里面存放的是应用程序的源文件,包括资源文件和可执行文件(比如多媒体文件)。NSString *path = [[NSBundle mainBundle] bundlePath];
Documents:最常用的目录,适合存储重要数据。NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
Library
Caches:适合存储体积大,不需要备份的非重要数据。NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
Preferences:通常保存应用的设置信息。
tmp:系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件。NSString *path = NSTemporaryDirectory();
一:plist文件存储:
将某些特定的类,通过XML文件方式存储在ba目录中。可以被序列化存储的类型 有:NSArray;NSMutableArray;NSDictionary;NSMutableDictionary;NSData;NSMutableData;NSString;NSMutableString;NSNumber;NSDate;
1.获取路径:Documents目录获取,
2.存储:
NSArray *array = @[@
"123"
, @
"456"
, @
"789"
];
[array writeToFile:fileName atomically:YES];
3.读取:NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
二:偏好设置(preference)
存储:举例:
//1.获得NSUserDefaults文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//2.向文件中写入内容
[userDefaults setObject:@
"AAA"
forKey:@
"a"
];
[userDefaults setBool:YES forKey:@
"sex"
];
[userDefaults setInteger:21 forKey:@
"age"
];
//3.所以如果需要立即写入文件的就必须调用synchronize方法。
[userDefaults synchronize];
//4.读取文件
NSString *name = [userDefaults objectForKey:@
"a"
];
BOOL sex = [userDefaults boolForKey:@
"sex"
];
NSInteger age = [userDefaults integerForKey:@
"age"
];
NSLog(@
"%@, %d, %ld"
, name, sex, age);
三:NSKeyedArchiver(归档)
遵循NSCoding协议中的两个方法:一个是说明如何将对象编码到归档中,另一个说明如何解档获取新对象。
存储过程:
1.遵循协议和设置属性
//1.遵循NSCoding协议
@interface Person : NSObject
//2.设置属性
@property (strong, nonatomic) UIImage *avatar;
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) NSInteger age;
@end
2.实现协议方法
//归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.avatar forKey:@
"avatar"
];
[aCoder encodeObject:self.name forKey:@
"name"
];
[aCoder encodeInteger:self.age forKey:@
"age"
];
}
//解档
- (id)initWithCoder:(NSCoder *)aDecoder {
if
([
super
init]) {
self.avatar = [aDecoder decodeObjectForKey:@
"avatar"
];
self.name = [aDecoder decodeObjectForKey:@
"name"
];
self.age = [aDecoder decodeIntegerForKey:@
"age"
];
}
return
self;
}
3.如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。
即 [super encodeWithCoder:aCoder] 和 [super initWithCoder:aDecoder] 方法;
使用:
写入:
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
stringByAppendingPathComponent:@
"person.data"
];
Person *person = [[Person alloc] init];
person.avatar = self.avatarView.image;
person.name = self.nameField.text;
person.age = [self.ageField.text integerValue];
[NSKeyedArchiver archiveRootObject:person toFile:file];
读取:
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
stringByAppendingPathComponent:@
"person.data"
];
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
if
(person) {
self.avatarView.image = person.avatar;
self.nameField.text = person.name;
self.ageField.text = [NSString stringWithFormat:@
"%ld"
, person.age];
}
四:SQLites(小型数据库)
五:coreData(数据库相比sqlite更高级)