应用沙盒:应用文件系统的根目录,每个应用都有独自的沙盒相互;在xcode中可以用NSHomeDirectory()函数,打印当前应用的沙盒根路径。

应用程序包:包含了所有资源文件和执行文件;

  * Documents:保存应用运行时生成的需要持久化的数据,iTunes同步会备份该目录。

  * tmp:保存应用运行时生成的临时数据,使用完毕后再将相应的文件从该目录从删除,应用没有运行时系统也会自动清楚该目录,iTunes同步时不会被备份该目录。

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

  * Library/Preference:保存应用的所有偏好设置,iOS的setting(设置)应用会在这在该目录中查找应用的设置信息。iTunes同步时,会备份该目录。

获取Documents目录的两种方式:

  1,NSHomeDirectory()获取应用的根目录,然后用NSString类的对象方法stringByAppendingPathComponent:拼接Documents.

//获取到应用根目录

NSString *home = NSHomeDirectory();
NSString *path =[home stringByAppendingPathComponent:@"Documents"];

  2,NSSearchPathForDirectoriesInDomains()函数

//NSUserDomainMask 代表从用户文件夹下找
//NO 代表不展开路径下的波浪字符“~” NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,NO); //在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素
NSString *document = [arr objectAtIndex:0];

获取tmp路径:NSString *tmp = NSTemporaryDirectory();

获取Library/Caches路径:NSString *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,NO);

获取Library/Preference:通过NSUserDefaults类获取信息。

iOS应用常用的数据存储方式有:

  * XML属性列表(plist)归档;

  * preference(偏好设置);

  * NSKeyedArchiver归档(NSCoding);

  * SQLite3

  * Core Data;

XML属性列表

  是一种xml格式的文件,拓展名为plist.若对象是NSString\NSDictionary\NSArray\NSData\NSNumber等类型,

  都可以调用writeToFile:aomically:方法将对象写到plist文件中。

 

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"1223244" forKey:@"phone"]; //filePath 可以documens路径或者沙盒里其他路径;
[dict writeToFile:filePath atomically:YES]; //读取plist文件;
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];

Preference(偏好设置):很多iOS应用都支持偏好设置,比如保存用户名、密码、字体大小等设置。每个应用都有一个NSUserDefaults实例,通过这个实例来存取偏好设置。

//存储偏好设置内容

NSUserDefaults *defaluts = [NSUserDefaults standardUserDefaults];

[defaults setobject:@"jack" forKey:@"UserName"];
[defaults setFloat:190.1f forKey:@"height"];
[defaults setBool:YES forKey:@"autoLogin"]; //取得偏好设置内容
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *userName = [defaults stringForKey:@"userName"];
float height = [defaults floatForKey:@"height"];
BOOL autoLogin = [defaults boolForKey:@"autoLogin"];

* 注意:NSUserDefaults 设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘,所以调用了set方法之后数据可能还没写入磁盘应用程序就终止。

  出现以上问题可以调用synchronize方法强制写入。

[defaults synchronize];

NSKeyedArchiver归档(NSCoding)

  * 如果对象是NSString、NSDictionary、NSData、NSArray、NSNumber等,可以直接用NSKeyedArchiver进行归档和恢复。

  * 其他对象需要遵循NSCoding协议。

  * NSCoding协议的两个方法:

    · encodeWithCode:每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以用encodeObject:forKey:\encodeInt:forKey:等方法进行归档。

    · initWithCoder:每次从文件中恢复(解码)时,都会调用这个方法。这个方法指定如何解码文件中的数据转为对象的实例变量。可以用使用decodeObject:forKey\decodeInt:forKey:等方法解码实例变量。

//创建Person对象 遵守 NSCoding 协议
Person.h @interface Person : NSObject @property(copy,nonatomic) NSString *name; @property(assign,nonatomic) int age; @end Person.m #import "Person.h" @implementation Person - (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInt:self.age forKey:@"age"]; } - (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntForKey:@"age"]; } return self; } @end //获取归档路径文件filePath Person *p = [[Peron alloc] init]; p.name = @"jack"; p.age = 10; NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectiory,NSUserDomainMask,YES) lastObject]; NSString *filePath = [doc stringByAppendingPathComponent:@"person.data"]; //对象归档 [NSKeyedArchiver archiveRootObject:p toFile:filePath]; //从filePath中读取对象 Person *p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

***注意 :如果对象的父类也遵守了NSCoding的协议,

  在实现encodeWithCoder:方法中应该调用 [super encodeWithCoder:aCoder]; 

  实现initWithCoder:方法中 应该调用 self = [super initWithCoder:aCoder];

确保继续的成员变量能被归档和解档。

NSData

  * 使用archiveRootObject:toFile:方法可以将一个对象直接写入一个文件中,但多时候需将多个对象同时写入到一个文件中,那么就用到NSData来归档。

  * NSData可以为一些数据提供临时的存储空间,以便随后写入文件;或者存放从磁盘读取文件的内容。可以使用[NSMutableData data]创建可变数据空间;

  

  

  归档(编码)

//新建一块可变数据区
 NSMutableData *data = [NSMutableData data];
//将数据连接一个NSKeyedArchiver对象
 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWrittingWithMutableData:data];
//开始存档对象,存储的数据会存档到data中
[archiver encodeObject:person1 forKey:@"person1"];
[archiver encodeObject:person2 forKey:@"person2"];
//存档完毕。一定要调用finishEnCoding方法
[archiver finishEncoding];
//将存档的数据,写到文件中
[data writeToFile:filePath atomically:YES];

  解档(解码)

//从文件中获取数据
NSData *data [NSData dataWithContentsOfFile:filePath];
//根据获取到的数据,解析成一个NSKeyedUnarchiver对象
NSKeyUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *p1 = [unarchiver decodeObjectForKey:@"person1"];
Person *p2 = [unarchiver decodeObjectForKey:@"person2"];
//恢复完毕
[unarchiver finishDeCoding];

***利用归档实现深复制

//临时存储一个person1对象
NSData *data = [NSKeyedArchiver archiveDataWithRootObject:person1];
Person *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];

iOS笔记———数据存储的更多相关文章

  1. iOS学习笔记--数据存储

    iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 1. XM ...

  2. iOS 应用数据存储方式(XML属性列表-plist)

    iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...

  3. iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

    iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ...

  4. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  5. iOS开发UI篇—ios应用数据存储方式(归档)

    iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同 ...

  6. iOS本地数据存储(转载)

    看到一篇不错的文章,推荐给大家!!! 应用沙盒 1)每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒 2)应用沙盒的文 ...

  7. iOS应用数据存储的常用方式

    iOS应用 数据存储的常用方式 XML属性列表 plist Preference 偏好设置 NSKeyedArchiver 归档 Core Data SQLite3 应用沙盒: Layer:     ...

  8. iOS开发技术分享(1)— iOS本地数据存储

    iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...

  9. iOS开发UI篇—ios应用数据存储方式(归档) :转发

    本文转发至:文顶顶http://www.cnblogs.com/wendingding/p/3775293.html iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist ...

随机推荐

  1. Flash跨域传输数据 crossdomain.xml

    一.概述位于www.a.com域中的SWF文件要访问www.163.com的文件时,SWF首先会检查163服务器目录下是否有crossdomain.xml文件,如果没有,则访问不成功:若crossdo ...

  2. cookie (储存在用户本地终端上的数据)

    Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 RFC2109 和 2965 中的都已废弃 ...

  3. 微信的audio无法自动播放的问题

    一.问题 最近做了一个html5的项目,里面涉及到音乐播放,项目要求音乐进入页面就自动播放,于是我就想到了html5的audio标签,将mp3引入进去. 1.在audio标签里引入了autoplay属 ...

  4. JAVA基础学习——1.3 关于JAVA环境变量设定 Path,Java_Home,ClassPath

    在安装完JDK以后,要设定JAVA环境变量. 刚接触的时候,我很困惑,这特么什么玩意啊,然后知其然不知其所以然的 按照说明做完了却不知道为什么这么做,这里简单做一些总结说明. 首先,什么是环境变量 环 ...

  5. 触发bfd 的条件

    满足下列条件之一就可触发BFC [1]根元素,即HTML元素 [2]float的值不为none [3]overflow的值不为visible [4]display的值为inline-block.tab ...

  6. 使用winshark分析三次握手,四次挥手

    三次握手 ip 106.120.167.67捕获的数据 数据信息   分析: 从图中可以看出,前三条为三次握手过程,使用TCP协议. 结合图,第一条为建立连接请求,客户端向服务器发送SYN=1的报文, ...

  7. iOS Swift的一些小知识(不断补充)

    1. 在swift文件里是不能写c语言函数的,不兼容c,直接报错.想调用c语言函数,就要利用系统提供的桥接功能,就如同swfit中调用oc一样! 2.swift 2.0后提供了@convention( ...

  8. component

    在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的Java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类 ...

  9. 应用市场中包名(package name)的唯一性

    一般的应用商店,在开发者上传应用(APP)的时候,都会对应用的包名进行唯一性的校验.如果此时,用户上传的应用的包名与数据库中的已有的APP的包名一样,那么正常情况下,该应用就不能上传,而弹出提示说,该 ...

  10. windows server 2008 wamp安装报000F15A0解决方法

    wampserver2.2c-x64 原因:缺少Visual C++ 2008 Runtime x64,官网地址http://www.microsoft.com/zh-cn/download/deta ...