沙盒机制
之前在真机测试查找录音文件的时候我们已经有了解过沙盒机制
NSString *homeDir = NSHomeDirectory();

- Documents存放的是app数据库文件
在 iOS11 以后新增了一个 文件 APP,集中管理 iOS 上应用内创建的文件,以及各个云盘服务中保存的文件。在 iOS 工程 info.plist 中设置 Application supports iTunes file sharing 和Supports opening documents in place 这两个选项为 YES(默认为 NO),就可以将该应用的沙盒 Documents路径下的文件暴露在文件 APP 中。 - Library 默认存放设置和其他状态信息。除了caches子目录之外其他目录都会被iclude同步
-
Application Support 此目录包含应用程序用来运行但应对用户隐藏的文件,如游戏的新关卡等文件。 -
Caches 保存应用运行时生成的需要持久化的数据,一般存储体积大、不需要备份的非重要数据,如网络请求的音视频与图片等的缓存。在 iOS 5.0 及以后版本中,Caches 当系统磁盘空间非常低时,系统可能会在极少数情况下该删除目录(APP 正在运行时不会发生),所以尽量保证该路径的文件在 APP 在重新运行时可以得到重新创建。 -
Cooikes 系统会自动将App中网络请求的cookie保存为文件 -
Preferences 保存应用的所有偏好设置。UserDefaults生成的plist文件就会保存该目录下。 -
SplashBoard 存储启动屏缓存,缓存文件格式为 ktx,本质上就是图片,如果启动屏不生效的问题可以考虑从删除该路径下相关缓存文件这个角度解决; -
WebKit 存储 WKWebView 相关的一些数据,如 IndexDB、LocalStorage、WebSQL 等; SystemData 存放系统数据,无对外暴露的接口tmp 保存临时文件,后序不需要使用
持久化数据存储的方式
XML属性列表(plist)
属性列表是一种XML格式的文件,拓展名为plist
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用 writeToFile:atomically: 方法直接将对象写到属性列表文件中
我们需要手动写个目录
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString * filePath = [docPath stringByAppendingPathComponent:@"xx.plist"];
NSDictionary* dict = @{ @"key" :@"value", @"key1" : @"value1" };
[dict writeToFile:filePath atomically:YES];
NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"%@", dict);
NSArray* array = @[ @"123123",@"111111" ];
[array writeToFile:filePath atomically:YES];
NSArray* array = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@", array);


Preferences偏好设置(UserDefaults)
很多iOS应用都支持偏好设置,提供了一套标准的解决方案来为应用加入偏好设置功能,比如保存用户名,字体大小,密码,是否自动登录等。
特点:不会自动删除,iclude\itune同步,不适合存大数据。即时操作需要注意同步问题,不需要设置路径和文件名
其本身的创建类似于单例模式 我们在后面用不同的属性名再次申请创建,会覆盖之前的数据
我们使用UserDefaults注册一个账号密码试一下
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:_nameTextField.text forKey:@"name"];
[defaults setObject:_passwordTextField.text forKey:@"password"];
[defaults synchronize];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *name = [defaults objectForKey:@"name"];
NSString *password = [defaults objectForKey:@"password"];
 
NSKeyedArchiver归档
-
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复  -
特点:存入Document,不会自动删除,可存放大型数据,iclude/iTune同步,存放用户产生的数据,如游戏,操作记录等等。 -
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSS ecureCoding 协议的对象才可以。NSSecureCoding 也遵循了原来NSCoding 这个协议,不过我们还需要遵循一个supportsSecureCoding 方法 -
NSCoding 有两个方法: -
encodeWithCoder 每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量。可以使用encodeObject:forKey: 方法归档实例变量 -
initWithCoder 每次从文件中会恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey 方法解码实例变量
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:_name forKey:@"name"];
[coder encodeInt:_age forKey:@"age"];
}
- (id)initWithCoder:(NSCoder *)coder {
if(self = [super init]) {
_name = [coder decodeObjectForKey:@"name"];
_age = [coder decodeIntForKey:@"age"];
}
return self;
}
+ (BOOL)supportsSecureCoding {
return YES;
}
归档
- (void)save {
Person *person = [[Person alloc] init];
person.name = @"young_jerry";
person.age = 18;
NSError *error;
NSString *docu = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [docu stringByAppendingString:@"p.data"];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person requiringSecureCoding:YES error:&error];
if(error) {
NSLog(@"sodufosuf%@", error);
}
[data writeToFile:path atomically:YES];
}
读档
- (void)read {
NSError *error;
NSString *docu = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [docu stringByAppendingString:@"p.data"];
NSData *unData = [NSData dataWithContentsOfFile:path];
Person *person = (Person *)[NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:unData error:&error];
NSLog(@"%@--%d",person.name,person.age);
}
·
通过SQlite或CoreData保存在对象数据集
SQlite就是一个轻量级的数据库
CoreData是苹果推出的一个数据存储框架。CoreData提供了一种对象关系映射(ORM)的存储关系,类似于Java的hibernate框架。CoreData可以将OC对象存储到数据库中,也可以将数据库中的数据转化为OC对象,在这个过程中不需要手动编写任何SQL语句,CoreData封装了数据库的操作过程,以及数据库中数据和OC对象的转换过程。 所以在使用CoreData的过程中,很多操作就像是对数据库进行操作一样,也有过滤条件、排序等操作。
这就相当于CoreData完成了Model层的大量工作,例如Model层的表示和持久化,有效的减少了开发的工作量,使Model层的设计更加面向对象。
SQLite和CoreData的区别
- CoreData可以在一个对象更新时,其关联的对象也会随着更新,相当于你更新一张表时,其关联的其他表的也回随着更新
- CoreData供更简单的性能管理机制,可以限制查询记录的总数,这个类会自动更新其缓存
- 多表查询方面,CoreData没有SQL直观,没有类似外连接,左连接等操作.
|