iOS数据存储方式
- Preference(偏好设置)
- 写入式(plist(XML属性列表归档));
- NSKeyedArchiver归档(NSCoding)
- 数据库(SQLite3)存储 (关系型数据库);
- Core Data(对象型的数据库);
应用沙盒
结构:
- Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
- tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
- Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据
- Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
偏好设置
- 偏好设置可以存储的数据类型:存储基本数据类型(NSData、NSString、 NSNumber、NSDate、NSArray、NSDictionary),不可以存储自定义对象;
- 存储位置:Library/Preferences文件夹下;
if (json != nil) {
// 存储
[[NSUserDefaults standardUserDefaults] setObject:json forKey:YANForumTitles];
} else{
// 读取
forum.titles = [YANTagTitle mj_objectArrayWithKeyValuesArray:[[NSUserDefaults standardUserDefaults]objectForKey:YANForumTitles]];
}
写入式(plist-XML属性列表归档)
- 存储的数据类型为:存储基本数据类型(NSData、NSString、 NSNumber、NSDate、NSArray、NSDictionary),不可以存储自定义对象;
// 系统路径
NSString *DocuPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 拼接文件路径
NSString *path = [DocuPath stringByAppendingPathComponent:@"liuyan.plist"];
// 写入
[json writeToFile:path atomically:YES];
// 读取并转化为模型
forum.titles=[YANTagTitle mj_objectArrayWithKeyValuesArray:[NSArray arrayWithContentsOfFile:path]];
归档(NSKeyedArchiver)
- 如果想将一个自定义对象保存到文件中必须实现NSCoding协议
- 存储的数据类型:不仅可以存储基本的数据类型,还可以存储自定义对象;
// 系统路径
NSString *DocuPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 拼接文件路径
NSString *path = [DocuPath stringByAppendingPathComponent:@"titles.liuyan"];
// 写入
[NSKeyedArchiver archiveRootObject:forum.titles toFile:path];
// 读取
for (int i = 0; i < forum.titles.count; i++) {
YANTagTitle *title=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
}
- 设置文件存储属性
文件存储时为执行:-(void)encodeWithCoder:(NSCoder *)aCoder;
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInteger:self.ID forKey:@"ID"];
[aCoder encodeObject:self.n forKey:@"n"];
}
读取文件时执行:- (instancetype)initWithCoder:(NSCoder *)aDecoder;
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
//注意:在构造方法中需要先初始化父类的方法
if (self=[super init]) {
self.ID=[aDecoder decodeIntegerForKey:@"ID"];
self.n=[aDecoder decodeObjectForKey:@"n"];
}
return self;
}
网友评论