iOS应用数据存储的常用方式

整理印象笔记之 关于iOS应用数据存储的常用方式

  • XML属性列表(plist)归档
  • NSUserDefaults(偏好设置)
  • NSKeyedArchiver归档(NSCoding)
  • Core Data
  • SQLite3

应用沙盒

每个iOS的APP都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离,应用必须待在自己的沙盒里,其他应用是访问不了该沙盒

应用沙盒的文件系统目录,

应用程序包:
  • Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录

  • tmp:保存应用运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除,应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录

  • Library/Canches:保存应用运行时 生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的数据

  • Library/Preference:保存应用的所有偏好设置,iOS的Setting应用会在该目录中查找应用的设备信息。iTunes同步设备时会备份该目录

Plist:保存数组和字典

//获取应用沙盒
NSString * homePath =  NSHomeDirectory();
//获取temp
NSString * temp =  NSTemporaryDirectory();
//获取Cache
//NSSearchPathDirectory:搜索的目录
//NSSearchPathDomainMask:搜索范围
//expandTilde:是否展开全路径,如果没有展开,应用的沙盒路径就是~
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)[0];
NSString *filePath = [path stringByAppendingString:@"arr.plist"];

关于存取


NSDictionary *dic = @{@"key":@"vlaue",@"name":@"xiaoming"};
//存
[dic writeToFile:filePath atomically:YES];
//取    
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];


NSArray *arr = @[@"1",@"2"];
//存
[arr writeToFile:filePath atomically:YES];
//取    
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];

NSUserDefaults(可以是任何对象类)

存储位置(Preferences)

这里写图片描述

具体实现:

//存:
NSUserDefaults *suerdefaults = [NSUserDefaults standardUserDefaults];
[suerdefaults setValue:@"value" forKey:@"key"];
//iOS7之前,需要加上这句,默认不会马上和硬盘同步
[userDefaults synchronize];

//取:
NSString *str = [userDefaults valueForKey:@"key"];

NSKeyedArchiver归档

一个自定义对象想要归档,必须遵守NSCoding协议

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingString:@"Student.data"];

Student *stu = [[Student alloc]init];
stu.name = @"name";
stu.age = 12;

//归档
//如果是数组,底层会遍历数组元素,一个一个的归档,
//如果是对象,就直接归档

[NSKeyedArchiver archiveRootObject:stu toFile:filePath];

//解档
Student *stu1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@---%ld",stu1.name,(long)stu1.age);
#import "Student.h"
//一个自定义对象想要归档,必须遵守NSCoding协议
@interface Student()<NSCoding>

@end
@implementation Student
//描述当前对象里有哪些属性需要归档
- (void)encodeWithCoder:(nonnull NSCoder *)aCoder {

    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeInteger:_age forKey:@"age"];
}

//描述当前对象里有哪些属性需要解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值