zoukankan      html  css  js  c++  java
  • iOS沙盒及数据存储

    时间久了容易忘,针对沙盒的相关实用技巧做一个记录和整理。

    一、iOS数据存储常用方式

     1、XML属性列表(plist)

     不是所有对象都可以写入;

     2、Preference(偏好设置)

     本质还是通过“plist”来存储数据,但是使用简单(无需关注文件、文件夹路径和名称);

     3、NSKeyedArchiver归档(NSCoding)

     把任何对象,直接保存为文件的方式;

     4、SQLite3

     当非常大量的数据存储时使用;

     5、CoreData

     就是对SQLite的封装。

     本文只做前三种研究

     二、沙盒概述

     1、每个iOS应用都有自己的应用沙盒(应用沙盒就是应用的文件夹),与其他文件系统隔离。

     2、应用必须呆在自己的沙盒里,其他应用不能访问该沙盒。

     3、区别Bundle路径(app的安装目录),沙盒是app的存储路径。

     4、应用沙盒的文件系统目录如下:

    三、沙盒结构

     1、Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。保存相对重要的数据。

     2、tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。保存不重要的并且大的数据。

     3、Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据

     4、Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。该目录由系统管理, 无需我们来管理。通常用来存储一些基本的软件配置信息, 比如记住密码、自动登录等。

    四、沙盒路径的获取以及路径的拼接

     1、沙盒根目录:NSHomeDirectory()

     2、4个文件夹路径

     (1)document:

     [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]

     (2)library:

     [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

     (3)tmp:

      NSTemporaryDirectory()

     (4)caches:

     [NSSearchPathForDirectoriesInDomains(NSCachesDirectory(), NSUserDomainMask, YES) lastObject];

    3、关于路径的备注:

     (1)参数: NSUserDomainMask 代表从用户文件夹下找; YES 代表展开路径中的波浪字符“~”。

     (2)NSSearchPathForDirectoriesInDomains方法,返回的是数组,在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素。

    4、路径的拼接

    (1)strA stringByAppendingPathComponent:@“data.plist” :此方法不用考虑strA中的“/”符号。

    五、iOS数据存储的三种方式

     1、writeToFile ,直接写成plist文件,存储类型不是任意对象

     例:[data writeToFile:path atomically:Yes] ; data为NSdata类型对象,path为存储路径,Yes为线程保护。

     2、NSUserDefaults偏好设置存储,不需要路径,注意使用同步

     (1)获取偏好设置对象

       NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

     (2)存储数据

      [defaults setObject:@"小明" forKey:@"name"];
    
      [defaults setInteger:100 forKey:@"money"];
    
      [defaults setBool:NO forKey:@“isSame”];

     (3)立即同步(防止数据丢失,强制同步更新,系统有时会延时处理)

      [defaults synchronize];

     (4)读取数据   

        NSString * name = [defaults objectForKey:@"name"];
    
        NSInteger money = [defaults integerForKey:@"money"];
    
        BOOL isOrNot = [defaults boolForKey:@"isSame"];

     (5)偏好设置存储新的数据,不会覆盖原有文件,会在原文件里面续写。 

    3、NSKeyedArchiver归档

    (1)如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复,不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以。

    (2)归档 ,例:[NSKeyedArchiver archiveRootObject:p toFile:path]; path为路径 

    (3)解档(反归档),例:Person *p =  [NSKeyedUnarchiver  unarchiveObjectWithFile:path];

    (4)遵守 NSCoding 协议(2个方法),存储哪种类型的对象,就在其类实现中重写以下方法。

    "归档"只是存储数据的过程,每次归档对象时,都会调用这个方法。这是告诉系统对象的哪些属性需要存储,该如何存储;若该属性没写则不会存储进去。

    -(void)encodeWithCoder:(NSCoder *)aCoder
    {
        [aCoder encodeObject:self.name forKey:@"name"];
    
        [aCoder encodeInt:self.girl forKey:@"girl"];
    
        [aCoder encodeBool:self.sure forKey:@"sure"];   
    
    } 

    "反归档"只是读取数据的过程,每次从文件中恢复(解码)对象时,都会调用这个方法。这是告诉系统取出的哪些数据赋值给对象的哪些属性,若该属性没写不会获取出来,注意super的调用。

    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        if(self = [super init]){
    
            self.name =  [aDecoder  decodeObjectForKey:@"name"];
    
            self.girl = [aDecoder decodeIntForKey:@"girl"];
    
            self.sure = [aDecoder decodeBoolForKey:@"sure"];    
        }
        return self;
    }
    
     
  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/cleven/p/5249001.html
Copyright © 2011-2022 走看看