4种数据持久存储到iOS文件系统的机制:
1.属性列表;
2.对象归档;
3.iOS的嵌入式关系数据库(SQLite3);
4.苹果公司提供的持久化工具Core Data。
应用程序的沙盒
苹果采用的是沙盒机制,一般沙盒中都会有三个文件夹,它们都有各自的作用。
1.Documents:应用程序将数据存储在Documents中,但基于NSUserDefaults的首选项设置除外。
2.Library:基于NSUserDefaults的首选项设置存储在Library/Preferences文件夹中。
3.tmp:tmp目录供应用程序存储临时文件。当iOS设备执行同步时,iTunes不会备份tmp中的文件,但在不需要这些文件时,应用程序要负责删除tmp中的文件,以免占用文件系统的空间。
*下面是检索Documents目路径的一些代码:
objective-c //常量NSDocumentDirectory表明我们正在查找Documents目录的路径;第二个常量NSUserDomainMask表明我们希望将搜索限制在应用程序的沙盒内。 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
*获取tmp目录
objective-c NSString *tmpPath = NSTemporaryDirectory();
属性列表
序列化对象:是指可以被转换为字节以便于存储到文件中或通过网络进行传输的对象。
可以通过writeToFile: atomically:(atomically参数让该方法将数据写入辅助文件,而不是写入到指定位置;成功写入该文件之后,辅助文件将被复制到第一个参数指定的位置)方法将他们存储到属性链表;可以序列化的对象NSArray;NSMutableArray;NSDictionary;NSMutableDictionary;NSData;NSMutableData;NSString;NSMutableString;NSNumber;无法使用其他的类,包括自定义的类。
**下面是例子
//BIDViewController.h中的代码
#import <UIKit/UIKit.h>
@interface BIDViewController : UIViewController
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *lineFields;
@end
#import "BIDViewController.h"
@interface BIDViewController ()
@end
@implementation BIDViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
[self.lineFields enumerateObjectsUsingBlock:^(UITextField *textFiledObj, NSUInteger idx, BOOL * _Nonnull stop) {
textFiledObj.text = array[idx];
}];
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)applicationWillResignActive:(NSNotification *)notification {
NSString *filePah = [self dataFilePath];
NSArray *array = [self.lineFields valueForKey:@"text"];
[array writeToFile:filePah atomically:YES];
}
-(NSString *)dataFilePath
{
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [path stringByAppendingPathComponent:@"data.plist"];
}
@end