• 数据存储常用的五种方式(一)


      iOS开发中数据存在五种存储方式之三:

        1.plist(XML属性列表归档)

        2.偏好设置

        3.NSKeydeArchiver归档(存储自定义对象)
     
    一、plist(XML属性列表归档)只能存取对象类文件
    第一种方式:(四个文件夹都可以取出路径)
    1 //获取沙盒路径
    2     NSString *home = NSHomeDirectory();
    3     //获取documents的路径两种方式(其它三个文件夹也能获取)
    4     NSString *path = [home stringByAppendingString:@"/documents"];
    5     NSString *path1 = [home stringByAppendingPathComponent:@"library/cache"];

    第二种方式:(仅有documents和cache能取出路径)(获取路径的时候必须写成YES,否则无法成功写入)

    1  //获取cache路径,NO表示文件路径前面用“~”表示
    2 NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) lastObject];
    3 NSString *doucument = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
    4 //拼接路径
    5 NSString *path = [cache stringByAppendingPathComponent:@"abc.plist"];
    6 NSString *path1 = [doucument stringByAppendingPathComponent:@"/ce.plist"];
    7 //把文件写入文件夹
    8 [arr writeToFile:path atomically:YES];
    9 [arr writeToFile:path1 atomically:YES];

    读取文件:

    1 //读取文件
    2 NSArray *arr1 =  [NSArray arrayWithContentsOfFile:path];
    3 NSLog(@"%@",arr1);

    二、偏好设置(保存用户名、密码、字体大小、是否自动登录等等基本设置)自动保存到沙盒的Preferences文件夹中

    1 //获取对象
    2 NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    3 //存储数据
    4 [ud setObject:@"abc" forKey:@"这是什么"];
    5 [ud setObject:@"cde" forKey:@"俺是"];
    6 //读取数据
    7 NSString *str = [ud objectForKey:@"俺是"];
    8 NSString *str1 = [ud objectForKey:@"这是什么"];
    9 NSLog(@"%@---%@",str,str1);

    注意:偏好设置存储时候,保存的时间不确定,可能是将来的某个时间存储到文件夹中,所以可以马上同步存储:

        [ud synchronize];

    三、NSKeyedArchive的归档(存储自定义对象)

    在viewController.m中:

     1 - (void)viewDidLoad {
     2     [super viewDidLoad];
     3     
     4     ZWPerson *p = [[ZWPerson alloc] init];
     5     p.name = @"mc";
     6     p.age = 18;
     7     p.height = 1.88;
     8     NSString *cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) lastObject];
     9     NSString *doucument = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
    10     //拼接路径
    11     NSString *path = [cache stringByAppendingPathComponent:@"abc.doc"];
    12     NSString *path1 = [doucument stringByAppendingPathComponent:@"/ce.doc"];
    13     //存储数据
    14     BOOL ar = [NSKeyedArchiver archiveRootObject:p toFile:path];
    15     BOOL ar1 = [NSKeyedArchiver archiveRootObject:p toFile:path1];
    16     NSLog(@"%d---%d",ar,ar1);
    17     //读取数据
    18     ZWPerson *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    19     ZWPerson *p2 = [NSKeyedUnarchiver unarchiveObjectWithFile:path1];
    20     NSLog(@"%zd---%@",p1.age,p2.name);
    21 }

    新建ZWPerson类(继承自ViewController)

    在ZWPerson.h中:

    1 #import "ViewController.h"
    2 @interface ZWPerson : ViewController
    3 /** 名字 */
    4 @property (strong, nonatomic)NSString *name;
    5 /** 年龄 */
    6 @property (assign, nonatomic)NSInteger age;
    7 /** 身高 */
    8 @property (assign, nonatomic)double height;
    9 @end

    在ZWPerson.h中:

     1 #import "ZWPerson.h"
     2 @interface ZWPerson ()
     3 @end
     4 @implementation ZWPerson
     5 //存储的时候调用这个方法
     6 - (void)encodeWithCoder:(NSCoder *)aCoder
     7 {
     8     //存储对象的属性(根据实际需要存储数据)
     9     [aCoder encodeObject:self.name forKey:@"name"];
    10     [aCoder encodeInteger:self.age forKey:@"age"];
    11     [aCoder encodeDouble:self.height forKey:@"height"];
    12 }
    13 //读取的时候调用
    14 - (instancetype)initWithCoder:(NSCoder *)aDecoder
    15 {
    16     if (self = [super initWithCoder:aDecoder]) {.
    17         //获取对象的属性(根据实际需要获取数据)
    18         self.name = [aDecoder decodeObjectForKey:@"name"];
    19         self.age = [aDecoder decodeIntegerForKey:@"age"];
    20         self.height = [aDecoder decodeDoubleForKey:@"height"];
    21     }
    22     return self;
    23 }
    24 @end

    如果是继承自NSObject:则只需要更改initWithCoder中的if(self = super init)即可

    注意:1、遵守NSCoding协议,并实现该协议中的两个方法。

         2、如果是继承,则子类一定要重写那两个方法。因为person的子类在存取的时候,会去子类中去找调用的方法,没找到那么它就去父类中找,所以最后保存和读取的时候新增加的属性会被忽略。需要先调用父类的方法,先初始化父类的,再初始化子类的。

         3、保存数据的文件的后缀名可以随意命名。

         4、通过plist保存的数据是直接显示的,不安全。通过归档方法保存的数据在文件中打开是乱码的,更安全。

  • 相关阅读:
    JavaScript基础初始时期分支(018)
    JavaScript基础尽量少使用全局变量(001)
    linux源码安装nodejs
    js导出excel
    http 状态码
    网站导航固定头部
    gulp编译less简单demo
    mysql设置连接等待时间(wait_timeout)
    mysql视图
    网站用户行为数据挖掘
  • 原文地址:https://www.cnblogs.com/hissia/p/5642405.html
Copyright © 2020-2023  润新知