zoukankan      html  css  js  c++  java
  • iOS 快速存储到本地

    iOS开发中经常用到本地持久化的技术,本地持久化的方法也很多,常用方法有如下几种:

    1.NSUserdaults (用户默认)

    2.write to file (写文件)

    3.NSkeyArchiver (归档解档)

    4.SQLite (数据库)

    5.core data (封装了SQLite)

    因为本随笔主要是针对快速储存,所以相对繁琐的数据库类型就不做介绍了,如果想了解SQLite,亲关注鄙人的相关随笔.

      1.NSUserdaults (用户默认)

        这个方法是所有方法里最为简单的,因为通常你只需要一行代码存储,一行代码提取数据.但是对存储的数据类型有所限制,支持:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary. Mutable类型也可以. 

        你看名字就能知道这个方法推荐让你存储一些用户的默认设置,比如:账户,密码,声音开关,震动开关等.但是不代表你不可以存储别的数据.

     1 - (void)viewDidLoad {
     2     [super viewDidLoad];
     3     //定义字符串张三
     4     NSString * str = @"张三";
     5     //存储张三
     6     [[NSUserDefaults standardUserDefaults] setObject:str forKey:@"zhangsan"];
     7     //创建对象李四
     8     Lisi * lisi = [[Lisi alloc]init];
     9     //给李四名字赋值
    10     lisi.name = @"李四";
    11     //这里使用了李明杰老师的第三方框架,因为 NSUserDefaults 存储类型有限制,不能存储模型
    12     NSMutableDictionary * dict = [lisi mj_keyValues];
    13     //存储李四
    14     [[NSUserDefaults standardUserDefaults] setObject:dict forKey:@"lisi"];
    15 }
    16 
    17 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    18     //读取数据
    19     id person1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"zhangsan"];
    20     id person2 = [[NSUserDefaults standardUserDefaults] objectForKey:@"lisi"];
    21     //其实我们知道person1 是个字符串 , person2是个字典
    22     NSLog(@"person1=%@ person2=%@",((NSString *)person1),[((NSMutableDictionary *)person2) objectForKey:@"name"]);
    23 }

      2.write to file (写文件)

        这个方法的特点是数据写成一个文件,如果存得是字符串,可用文本编辑器打开,如果存得是其他类型,那么存得是一个xml文件.支持:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary. Mutable类型也可以. 

     1 - (void)viewDidLoad {
     2     [super viewDidLoad];
     3     /**
     4      这里需要注意一下.持久化储存路径分为Documents,Library,Temp三个文件夹
     5      Documents文件夹会备份
     6      Library文件夹中的Preferences文件夹也会被备份.Caches文件夹不会被备份
     7      Tmp是临时文件,一般不往这个文件夹做持久化,这个文件夹会被系统自动清理
     8      */
     9     //我这里选择不会备份的Caches文件夹作为存储地址
    10     NSString * caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
    11     zhangsanFilePath = [caches stringByAppendingPathComponent:@"zhangsan"];
    12     //输出文件夹路径
    13     NSLog(@"caches=%@",caches);
    14     
    15     NSString * str = @"张三";
    16     NSError * error;
    17     [str writeToFile:zhangsanFilePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
    18     if (error) NSLog(@"error = %@",error);
    19     
    20     //创建对象李四
    21     Lisi * lisi = [[Lisi alloc]init];
    22     //给李四名字赋值
    23     lisi.name = @"李四";
    24     //这里使用了李明杰老师的第三方框架,因为模型是没有writeToFile方法.
    25     NSMutableDictionary * dict = [lisi mj_keyValues];
    26     lisifilePath = [caches stringByAppendingPathComponent:@"lisi"];
    27     [dict writeToFile:lisifilePath atomically:YES];
    28 }
    29 
    30 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    31     //读数据
    32     //因为你知道存储类型,所以读数据用类方法
    33     NSString * zhangsan = [NSString stringWithContentsOfFile:zhangsanFilePath encoding:NSUTF8StringEncoding error:nil];
    34     NSLog(@"zhangsan=%@",zhangsan);
    35     
    36     NSDictionary * lisi = [NSDictionary dictionaryWithContentsOfFile:lisifilePath];
    37     NSLog(@"lisi=%@",[lisi objectForKey:@"name"]);
    38 }

      3.NSkeyArchiver (归档解档)

        这种方法的特点是能够存储模型(前面两种储存模型时都需要转成字典),需要模型遵守NSCoding协议,还要重写encodeWithCoder和initWithCoder方法.

     1 //归档
     2 - (void)encodeWithCoder:(NSCoder *)aCoder {
     3     [aCoder encodeObject:_name forKey:@"NAME"];
     4 }
     5 //解档
     6 - (instancetype)initWithCoder:(NSCoder *)aDecoder {
     7     self = [super init];
     8     if (self) {
     9         _name = [aDecoder decodeObjectForKey:@"NAME"];
    10     }
    11     return self;
    12 }

        到这里准备工作做完了,然后进行存储和读取操作.这里也需要传路径

     1 - (void)viewDidLoad {
     2     [super viewDidLoad];
     3 
     4     NSString * caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
     5     NSLog(@"caches=%@",caches);
     6     lisifilePath = [caches stringByAppendingPathComponent:@"lisi"];
     7     
     8     Lisi * lisi = [[Lisi alloc]init];
     9     lisi.name = @"李四";
    10     //归档
    11     BOOL isSuccess = [NSKeyedArchiver archiveRootObject:lisi toFile:lisifilePath];
    12     if (isSuccess) NSLog(@"success");
    13     
    14 }
    15 
    16 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    17     //解档
    18     Lisi * lisi = [NSKeyedUnarchiver unarchiveObjectWithFile:lisifilePath];
    19     NSLog(@"lisi=%@",lisi.name);
    20 }

        总结:这三种持久化方法都各有特色,NSUserDaults适合配置文件,WriteToFile适合存储大数据,归档适合存储模型.

  • 相关阅读:
    选择排序——Selection Sort
    Android使用AIDL跨进程通信
    Android Gradle Plugin Version和Gradle Version 对应关系
    error: device unauthorized —— android studio 链接不上虚拟机
    Touch事件传递机制 Android
    Activity生命周期
    Error:Could not determine the class-path for interface com.android.builder.model.AndroidProject.
    Error:fatal: Not a git repository (or any of the parent directories): .git
    Installation failed with message...It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.
    Ajax 学习总结
  • 原文地址:https://www.cnblogs.com/huyp/p/5148965.html
Copyright © 2011-2022 走看看