一. iOS 开发中的数据存储有以下几种方式:
1.plist (XML属性列表归档)
2.偏好设置
3.NSKeydeArchiver 归档 (存储自定义对象/模型)
4.SQLite3 (数据库, 关系型数据库, 不能直接存储对象,要编写一些数据库的语句,将对象拆开存储)
5.CoreData (对象型的数据库, 把内部环节屏蔽)
二.这些数据都存储应用沙盒中
每个iOS应用都有⾃己的应⽤沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应⽤必须待在⾃己的沙盒里,其他应用不能访问该沙盒.
可以通过 NSLog(@"%@",NSHomeDirectory());打印出应用的沙盒地址,然后在 Finder 中前往文件夹进行查看,文件夹目录如下图:
三.应用沙盒结构分析
应用程序包:(上图中的Layer)包含了所有的资源文件和可执行文件
Documents:保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
tmp:保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会备份该目录
Library/Caches:保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份该目录。⼀一般存储体积大、不需要备份的非重要数据
Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置) 应⽤会在该⺫录中查找应⽤的设置信息。iTunes同步设备时会备份该目录
四.属性列表
● 属性列表是一种XML格式的文件,拓展名为plist
● 如果对象是NSString、NSDictionary、NSArray、NSData、 NSNumber等类型,就可以使用writeToFile:atomically:⽅法 直接将对象写到属性列表文件中
// 存数据
- (IBAction)save:(id)sender
{
// dict---------------------------存
// 获取doc的路径
NSString* docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
// 文件的路径
NSString* filePath = [docPath stringByAppendingPathComponent:@"xx.plist"];
// 自定义的对象不能保存到plist中
Person *p = [[Person alloc] init];
p.name =@"lnj";
NSDictionary* dict = @{ @"key" : @"value",
@"123" : @"321" };
[dict writeToFile:filePath atomically:YES]; // 线程安全的
/*
plist只能存储系统自带的一些常规的类, 也就是有writeToFile方法的对象才可以使用plist保存数据
字符串/字典/数据/NSNumber/NSData ...
*/
// array---------------------------存
// // 获取doc的路径
// NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
// // 文件的路径
// NSString* filePath = [docPath stringByAppendingPathComponent:@"xx.plist"];
//
// NSArray* array = @[ @"德莱厄斯", @"德玛西亚", @"123" ];
// // 1.如果做plist存储 : 有write to file
// [array writeToFile:filePath atomically:YES];
}
// 取数据
- (IBAction)read:(id)sender
{
// dict---------------------------取
// 获取doc路径
NSString* docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
// 文件的路径
NSString* filePath = [docPath stringByAppendingPathComponent:@"xx.plist"];
NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"%@", dict);
// array---------------------------取
// // 获取doc的路径
// NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
// // 文件的路径
// NSString* filePath = [docPath stringByAppendingPathComponent:@"xx.plist"];
//
// NSArray* array = [NSArray arrayWithContentsOfFile:filePath];
// NSLog(@"%@", array);
}