开发中经常涉及到数据持久化,避免了重复的请求服务器,减少了用户流量的消耗
1.NSUserDefault;
2.NSKeyedArchiver \ NSKeyedUnarchiver 归档
3. 嵌入式数据库 SQLite3
4.写入磁盘 .沙盒存储
1.NSUserDefault
官方API
NSUserDefaults类提供了便利的方法来访问常见类型如漂浮,双打,整数,布尔和url。一个默认的对象必须是一个属性列表,也就是的一个实例(或集合的组合的实例):NSData,NSString,NSNumber,处理NSDate,NSArray或NSDictionary。如果你想存储其他类型的对象,通常你应该存档NSData它来创建一个实例。更多细节,请参阅偏好和设置编程指南。
自动为每个用户创建一个默认的数据库。NSUserDefaults类目前不支持中偏好。要做到这一点,您必须使用CFPreferences API(参见偏好工具参考)。然而,NSUserDefaults正确读取中偏好,所以您可以安全地混合CFPreferences代码与NSUserDefaults代码
如果您的应用程序支持管理环境中,您可以使用一个NSUserDefaults对象来确定哪些偏好是由管理员用户的利益。管理环境对应计算机实验室或教室管理员或教师可能需要配置系统在一个特定的方式。在这些情况下,管理者可以建立一组默认首选项,迫使那些偏好的用户。如果一个偏好管理通过这种方式,应用程序应该防止用户编辑,偏好通过禁用任何适当的控制。
作为轻量级存储方式,上代码
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self saveData];
- [self readData];
- }
- - (void)saveData
- {
- int myInteger = 100;
- NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
- [userDefaults setInteger:myInteger forKey:@"myKey"];
- //同步存储到磁盘中,但是不是必须的
- [userDefaults synchronize];
- }
- - (void)readData
- {
- NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];
- //读取整型int类型的数据
- NSInteger myInteger = [userDefaultes integerForKey:@"myKey"];
- NSLog(@"%ld",myInteger);
- }
打印结果:
保存位置:
位于沙盒目录的 Library - Preferences --- plist 文件中
就在plist里面
2.NSKeyedArchiver \ NSKeyedUnarchiver 归档
- - (void)NSKeyedArchiverData
- {
- // 测试数据
- NSString *str1 = @"abc";
- NSString *str2 = @"123";
- NSArray *Array = [NSArray arrayWithObjects:str1, str2, nil nil];
- //Documents目录
- NSString *Path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
- NSString *filePath = [Path stringByAppendingPathComponent:@"test"];
- /**
- * 归档
- */
- [NSKeyedArchiver archiveRootObject:Array toFile:filePath];
- /**
- * 解归档
- */
- NSArray *dataArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
- for (NSString *str in dataArray) {
- NSLog(@"textStr ---- %@",str);
- }
- }
输出结果
3. 嵌入式数据库 SQLite3
请参考: 参考博客地址
4.写入磁盘 .沙盒存储
- - (void)NSFileManagerSave
- { //创建一个文件
- NSFileManager *manager = [NSFileManager defaultManager];
- NSString *filePath = [self filePath];
- [manager createFileAtPath:filePath contents:nil attributes:nil];
- //测试数据
- UIImage *image = [UIImage imageNamed:@"1.jpg"];
- NSData *imageData = UIImageJPEGRepresentation(image, 1);
- //写入文件
- [imageData writeToFile:filePath atomically:YES];
- }
- - (void)readNSFileManager
- { //从文件中读取数据
- NSData *data = [NSData dataWithContentsOfFile:[self filePath]];
- UIImage *image = [UIImage imageWithData:data];
- }
测试结果:
其实也可以,在沙盒拼接路径,不用NSFileManager,效果相同
- - (NSString *)getPath:(NSString *)fileName
- {
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:fileName];
- return filePath;
- }