iOS本地数据持久化

在iOS开发中常常需要将本地数据存储起来 通常有如下几种方式

  • plist存储
  • 偏好设置存储
  • 归档存储
  • SQLite存储
  • core data存储
    今天简单介绍一下前面三种存储方式
    • plist存储 --plist存储的本质就是生成一个plist文件 是用来存储数组和字典,但是需要注意的是自定义对象不能用plist来进行存储
      plist是什么类型存储的 读取也必须是同样的类型
    • plist存储的存储数据(比如想要存储一个数组)
    NSArray *array = @[@"jack",@26];
    //获取caches文件夹路径
    //NSSearchPathDirectory directory -->搜索文件夹
    //NSSearchPathDomainMask domainMask -->在哪个范围内查找
    //BOOL expandTilde -->是否展开
   NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    //拼接文件名
    NSString *filePath = [cachesPath stringByAppendingPathComponent:@"array.plist"];
    //存储数据
    [array writeToFile:filePath atomically:YES];
- plist存储的数据读取(比如想要读取一个数组)
    //获取caches文件夹路径
    NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    //拼接文件名
    NSString *filePath = [cachesPath stringByAppendingPathComponent:@"array.plist"];
    //读取文件
    NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
  • 偏好设置存储 --偏好设置存储是以字典的形式进行偏好设置,用法跟字典一样 偏好设置存储主要用到一个关键类NSUserDefaults
    偏好设置存储的好处:不需要关心文件名 可以快速进行键值对存储 可以存储基本数据类型
    • 偏好设置存储
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:@"jack" forKey:@"name"];
    [defaults setInteger:26 forKey:@"age"];
- 偏好设置读取
NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
    NSInteger age = [[NSUserDefaults standardUserDefaults] integerForKey:@"age"];
  • 归档存储 --任何对象都可以进行归档存储 自定义对象也可以
    NSKeyedArchiver专门用来做自定义对象归档
    • 归档存储(比如想要存储一个自定义对象car)
ZDCar *car = [[ZDCar alloc] init];
    car.brand = @"BMW";
    car.color = @"black";
    //获取caches文件夹
    NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    //拼接文件名
    NSString *filePath = [cachesPath stringByAppendingPathComponent:@"car.xxoo"];
    //存储数据
    [NSKeyedArchiver archiveRootObject:car toFile:filePath];
- 归档存储的读取
//获取caches文件夹
    NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    //拼接文件名
    NSString *filePath = [cachesPath stringByAppendingPathComponent:@"car.xxoo"];
    //读取数据
    ZDCar *car = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

注意:在调用
[NSKeyedArchiver archiveRootObject:car toFile:filePath];和[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];这两个方法时
底层会调用
- (void)encodeWithCoder:(NSCoder *)aCoder
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder这两个方法 所以需要在自定义的类中遵守这个协议并实现上述两个方法
还有一点需要注意 在实现- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder这个方法时当父类遵守了这个协议就需要调用[super initWithCoder:aDecoder] 反之则调用[super init]

你可能感兴趣的:(iOS本地数据持久化)