iOS的四种持久化存储

什么是数据持久化存储?

  所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。

什么是沙盒机制?

  iOS程序默认情况下只能访问程序自己的目录,这个目录被称为“沙盒”。目录结构如下:

    "应用程序包":这里面存放的是应用程序的源文件,包括资源文件和可执行文件(比如多媒体文件)。NSString *path = [[NSBundle mainBundle] bundlePath];
    Documents:最常用的目录,适合存储重要数据。NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
    Library
       Caches:适合存储体积大,不需要备份的非重要数据。NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
       Preferences:通常保存应用的设置信息。
    tmp:系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件。NSString *path = NSTemporaryDirectory();
 
一:plist文件存储:
  将某些特定的类,通过XML文件方式存储在ba目录中。可以被序列化存储的类型                有:NSArray;NSMutableArray;NSDictionary;NSMutableDictionary;NSData;NSMutableData;NSString;NSMutableString;NSNumber;NSDate;
  1.获取路径:Documents目录获取,
  2.存储: NSArray *array = @[@ "123" , @ "456" , @ "789" ];[array writeToFile:fileName atomically:YES];
  3.读取:NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
 
二:偏好设置(preference)
  存储:举例:
      //1.获得NSUserDefaults文件
      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
      //2.向文件中写入内容
      [userDefaults setObject:@ "AAA"  forKey:@ "a" ];
      [userDefaults setBool:YES forKey:@ "sex" ];
      [userDefaults setInteger:21 forKey:@ "age" ];
      //3.所以如果需要立即写入文件的就必须调用synchronize方法。
      [userDefaults synchronize];
 
      //4.读取文件
      NSString *name = [userDefaults objectForKey:@ "a" ];
      BOOL sex = [userDefaults boolForKey:@ "sex" ];
      NSInteger age = [userDefaults integerForKey:@ "age" ];
      NSLog(@ "%@, %d, %ld" , name, sex, age);
 
三:NSKeyedArchiver(归档)
  遵循NSCoding协议中的两个方法:一个是说明如何将对象编码到归档中,另一个说明如何解档获取新对象。
  存储过程:
    1.遵循协议和设置属性       
      //1.遵循NSCoding协议 
       @interface Person : NSObject    //2.设置属性
       @property (strong, nonatomic) UIImage *avatar;
       @property (copy, nonatomic) NSString *name;
       @property (assign, nonatomic) NSInteger age;
       @end
    2.实现协议方法
      //归档
       - (void)encodeWithCoder:(NSCoder *)aCoder {
           [aCoder encodeObject:self.avatar forKey:@ "avatar" ];
           [aCoder encodeObject:self.name forKey:@ "name" ];
           [aCoder encodeInteger:self.age forKey:@ "age" ];
       }
      
    //解档
       - (id)initWithCoder:(NSCoder *)aDecoder {
         if  ([ super  init]) {
             self.avatar = [aDecoder decodeObjectForKey:@ "avatar" ];
             self.name = [aDecoder decodeObjectForKey:@ "name" ];
             self.age = [aDecoder decodeIntegerForKey:@ "age" ];
         }
           return  self;
       }

    3.如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。

     即 [super encodeWithCoder:aCoder] 和 [super initWithCoder:aDecoder] 方法;

  使用: 

   写入:

   NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject 

              stringByAppendingPathComponent:@ "person.data" ];
     Person *person = [[Person alloc] init];
     person.avatar = self.avatarView.image;
     person.name = self.nameField.text;
     person.age = [self.ageField.text integerValue];
     [NSKeyedArchiver archiveRootObject:person toFile:file];
 
   读取:
    NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject 
              stringByAppendingPathComponent:@ "person.data" ];
     Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
     if  (person) {
        self.avatarView.image = person.avatar;
        self.nameField.text = person.name;
        self.ageField.text = [NSString stringWithFormat:@ "%ld" , person.age];
     }

四:SQLites(小型数据库)

五:coreData(数据库相比sqlite更高级)

  

转载于:https://www.cnblogs.com/lh-learn/p/5854388.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值