• IOS数据存储方式


    1,ios中常用的数据存储方式有4中

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

     2》Preference(偏好设置)

     3》NSKeyedArchiver归档

     4》SQLite

    2,每个应用程序都有自己的沙盒,沙河的路径为

    /Users/apple/Library/Application Support/iPhone Simulator/7.0/Applications(apple为用户名,7.0位模拟器版本)

    每个应用沙河都是独立的,里面的结构主要有;

    Document:这个主要用来保存运行时“用户”生成的需要持久化的数据,iTunes同步的时候会备份该目录。(一般应用下载的数据不要保存在这个目录,要不然苹果审核的时候应用程序通不过,本人就吃过这个亏。)

    tmp:保存应用运行是所需要的临时数据,使用完毕后再删除, iTunes同步的时候不会备份该目录。

    Library:

       1》Library/Caches:保存应用运行时生成的需要持久化的数据, iTunes同步的时候不会备份该目录。

      2》Library/Preference:保存应用程序的所以偏好设置,iTunes同步的时候会备份该目录。

    3,下面给大家来几段简单的事例程序,献丑了。

    如果属性列表是⼀种XML格式的⽂文件,拓展名为plist

    如果对象是NSStringNSDictionaryNSArrayNSDataNSNumber等类型,就可以使⽤用writeToFile:atomically:⽅法直接将对象写到属性列表⽂文件中 。

        1> : Document:

      写数据:

     {

      //1,获取沙盒中Document的路径

        NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

        //2,拼接保存文件的路径

        NSString *path = [documents stringByAppendingPathComponent:@"array.plist"];

        //3,把数据写到plist

        NSArray *array = @[@"li",@"kui",@"liang"];

        [array writeToFile:path atomically:YES];

    }

      读取数据:

    {

      //,拼接保存文件的路径

      NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];   

        NSString *path = [documents stringByAppendingPathComponent:@"array.plist"];

      NSArray *array =  [NSArrayarrayWithContentsOfFile:path];

        NSLog(@"array = %@",array); 

    }

      2 > :偏好设置 Preferences :

    缺点:(1)不能保存自定义对象

              (2)无任保存多少数据都是在同一个文件中

    保存数据:

    {

    //获取偏好设置对象,默认会将数据保存到Perferences,并且有默认的文件名称,所以不用指定文件名称和路径

        //一般以standarddefault,开头的都是单例对象

        NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];

        

        //保存数据

        [defaults setObject:@"lkl" forKey:@"name"];

        [defaults setInteger:25 forKey:@"age"];

        [defaults setDouble:1.75 forKey:@"heigth"];

        

        //一般Perferences中的数据不会立即保存,需要调用这个方法立即保存

        [defaults synchronize];

    }

    读取数据:

    {

      NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];  

       NSString *name = [defaults stringForKey:@"name"];

       double heigth = [defaults doubleForKey:@"heigth"];

       NSInteger age = [defaults integerForKey:@"age"]; 

    }

    NSKeyedArchiver :

    • 如果是自定义对象,不能调用writeToFile:atomically:⽅法直接将对象写到属性列表⽂文件中 。

    • 如果对象是NSStringNSDictionaryNSArrayNSDataNSNumber等类型,可以直接⽤用NSKeyedArchiver进⾏行归档和恢复

    • 不是所有的对象都可以直接⽤用这种⽅方法进⾏行归档,只有遵守了NSCoding 协议的对象才可以 

      

    • NSCoding协议有2个⽅方法:

      encodeWithCoder:

    每次归档对象时,都会调⽤用这个⽅方法。一般在这个⽅方法⾥里⾯面指定如何归档对象中的每 个实例变量,可以使⽤用encodeObject:forKey:⽅方法归档实例变量

      initWithCoder:

    每次从⽂文件中恢复(解码)对象时,都会调⽤用这个⽅方法。一般在这个⽅方法⾥里⾯面指定如何 解码⽂文件中的数据为对象的实例变量,可以使⽤用decodeObject:forKey⽅方法解 码实例变量 

    例题:

    NSKeyedArchiver-归档Person对象(Person.h) @interface Person : NSObject<NSCoding>

    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) int age;
    @property (nonatomic, assign) float height;
    @end

    @implementation Person

    • -  (void)encodeWithCoder:(NSCoder *)encoder {

      [encoder encodeObject:self.name forKey:@"name"];

    • [encoder encodeInt:self.age forKey:@"age"];

    • [encoder encodeFloat:self.height forKey:@"height"];

      }

    • -  (id)initWithCoder:(NSCoder *)decoder {

    • self.name = [decoder decodeObjectForKey:@"name"];

    • self.age = [decoder decodeIntForKey:@"age"];

    • self.height = [decoder decodeFloatForKey:@"height"];

    • return self;

      }

    • 归档(编码)
      Person *person = [[[Person alloc] init] autorelease]; person.name = @"lkl";
      person.age = 25;
      person.height = 1.75f;
      [NSKeyedArchiver archiveRootObject:person toFile:path];

      恢复(解码)

      Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

  • 相关阅读:
    【Linux】【Services】【SaaS】Docker+kubernetes(2. 配置NTP服务chrony)
    【Linux】【Services】【DNS】使用Bind搭建DNS服务
    【Linux】【Services】【SaaS】Docker+kubernetes(1. 基础概念与架构图)
    【Services】【Web】【LVS】lvs基础概念
    jquery.cookie.js 配置
    SQL Server2008 TIME类型
    Ext.MessageBox
    Ext.Form 自动填写表单内容
    Ext 中xtype一览
    ExtGrid
  • 原文地址:https://www.cnblogs.com/likuiliang/p/3768514.html
Copyright © 2020-2023  润新知