iOS中的存储方式
1.Plist
1.1 了解沙盒
每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其它文件系统隔离。应用必须呆在自己的沙盒里。其它应用不能访问该沙盒。
一个程序中所有的非代码文件都可以保存在沙盒中,例如 图像 图标 声音 映像 属性列表 文本文件等。
每个程序都有自己的沙盒存储空间
应用程序不能翻过自己的围墙去访问别的存储空间内容
应用程序请求的数据都要经过权限检测,假如条件不符合的话,不会被放行。
通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。
1.2 打开模拟器的沙盒目录
下面看看模拟器的沙盒文件夹在mac电脑上的什么位置。
文件都在个人用户名文件夹下的一个隐藏的文件夹里,中文叫做资源库,他的目录其实是Library
方法1、可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命名
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
输入完成后单击Enter健 退出终端 然后重新启动Finder就可以了
方法2 这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/ 前往。
username这里写你的用户名。
1.3 沙盒的目录结构
默认情况下 每个沙盒含有三个文件夹:Documents,Library,和tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件。
Documents: 苹果建议将程序中建立或者在程序中浏览到的文件数据保存在该目录下,iTunes备份或者恢复的时候 会包括此目录。
会备份数据,一般app数据不能保存在此目录下 否则会被拒绝。
Library:存储程序的默认设置货其它状态信息
Library/Caches 存放缓存文件 iTunes不会备份此目录 此目录下面文件夹不会再应用退出删除
下面包含两个目录Preferences:偏好设置 一般用来保存账号等, caches 专门用来处理缓存。
tmp 提供一个即时创建临时文件的地方。(数据随时会被删除)
iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。
1.2 plist存储实例
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中,下面是一个例子:在ViewDidLoad中存入数据,点击按钮取出数据:
- (void)viewDidLoad {
[super viewDidLoad];
//1. plistdemo
//拼接完整的文件路径
NSString *filePath = [self documentsPath];
NSString *finalPath = [filePath stringByAppendingPathComponent:@"tian.plist"];
NSLog(@"存文件%@",finalPath);
//向plist中写入内容
NSArray *plistData = @[@"",@"",@"",@""];
[plistData writeToFile:finalPath atomically:YES]; UIButton *button = [UIButton buttonWithType:];
button.frame = CGRectMake(, , , );
button.backgroundColor = [UIColor blackColor];
[button setTitle:@"读取数据" forState:UIControlStateNormal];
[button addTarget:self action:@selector(dataFromPlist) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button]; } - (void)dataFromPlist {
NSString *docPath = [self documentsPath];
//文件路径
NSString *filePath = [docPath stringByAppendingPathComponent:@"tian.plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"plist中的数据%@",array);
} - (NSString *)documentsPath {
//存放内容
//获取沙盒的Documents目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:];
return documentsDirectory;
}
打印结果为:
-- ::37.753 iOS 存储方式[:] plist中的数据(
,
,
, )
2.[b]NSUserDefaults(偏好设置)
用来保存应用程序的设置和属性,用户保存的数据,用户再次打开程序或者开机后这些数据仍然存在,NSUserDefaults可以存储的数据类型包括:NSData,NSString,NSNumber,NSDate,NSArray,NSDictionary.如果要存储其他类型,则需要转换为前面的类型,才能使用NSUserDefaults存储。很多iOS应用都支持偏好设置,比如保存用户名,密码,字体大小等设置。iOS提供了一套标准的解决方案来为应用假如偏好设置的功能。每个应用都有个NSUserDefaults实例,通过它来存取偏好设置 比如,保存用户名、字体大小、是否自动登录等。
NSUSerDefaults使用起来比较简单 下面是一个简单的例子:
- (void)userDefaultsDemo {
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *username = @"田小胖";
NSDictionary *dict = @{@"userName":@"田小胖",@"userAge":@""};
[userDefaults setObject:username forKey:@"userName"];
[userDefaults setObject:dict forKey:@"userInfo"];
[userDefaults synchronize];
} - (void)getDataFromUserDefaults {
NSUserDefaults *user = [NSUserDefaults standardUserDefaults]; NSString *userName = [user objectForKey:@"userName"]; NSDictionary *userinfo = [user objectForKey:@"userInfo"]; NSLog(@"%@ and %@",userName,userinfo);
}
打印结果:
iOS 存储方式[:] 田小胖 and {
userAge = ;
userName = "\U7530\U5c0f\U80d6";
}
3.NSKeyedArchiver
归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上;程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象。
归档方式
1.对Foundation框架中的对象进行归档
2.对自定义的内容进行归档
3.对自定义的对象进行归档
3.1对Foundation对象进行归档
//获得文件路径
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"]; //归档(序列化)
NSArray *archiveAry = @[@"jereh",@"ios"];
if ([NSKeyedArchiver archiveRootObject: archiveAry toFile:filePath]) {
NSLog(@"Archiver success");
} //解归档(反序列化)
NSArray *unArchiveAry = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@",unArchiveAry);
归档和解归档操作步骤简单
一次只能归档一个对象 如果是多个对象归档 需要分开进行
归档的对象是Foundation框架中对象
归档和解归档其中任意对象都需要归档和解归档整个文件
归档后的文件是加密的,所以归档文件的扩展名可以随意取
3.2对自定义对象进行归档
//获得文件路径
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"file.archiver"]; //1. 使用NSData存放归档数据
NSMutableData *archiverData = [NSMutableData data];
//2. 创建归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archiverData];
//3. 添加归档内容 (设置键值对)
[archiver encodeObject:@"jereh" forKey:@"name"];
[archiver encodeInt: forKey:@"age"];
[archiver encodeObject:@[@"ios",@"oc"] forKey:@"language"];
//4. 完成归档
[archiver finishEncoding];
//5. 将归档的信息存储到磁盘上
if ([archiverData writeToFile:filePath atomically:YES]) {
NSLog(@"archiver success");
} //解归档
//1. 从磁盘读取文件,生成NSData实例
NSData *unarchiverData = [NSData dataWithContentsOfFile:filePath];
//2. 根据Data实例创建和初始化解归档对象
NSKeyedUnarchiver *unachiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
//3. 解归档,根据key值访问
NSString *name = [unachiver decodeObjectForKey:@"name"];
int age = [unachiver decodeIntForKey:@"age"];
NSArray *ary = [unachiver decodeObjectForKey:@"language"];
NSLog(@"name=%@ age=%i ary=%@",name,age,ary);
3.3对自定义内容进行归档
Student.h
#import <Foundation/Foundation.h> @interface Student : NSObject<NSCopying,NSCoding> @property (nonatomic,copy) NSString *name; @property (nonatomic,copy) NSString *age; @property (nonatomic,assign) double weight; @property (nonatomic,copy) NSString *hobby; @property (nonatomic,copy) NSDictionary *others; @end
Student.m
#import "Student.h" #define knameKey @"name"
#define kageKey @"age"
#define kweightKey @"weight"
#define khobbyKey @"hobby"
#define kotherKey @"others" @implementation Student //归档
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_name forKey:knameKey];
[aCoder encodeObject:_age forKey:kageKey];
[aCoder encodeDouble:_weight forKey:kweightKey];
[aCoder encodeObject:_hobby forKey:khobbyKey];
[aCoder encodeObject:_others forKey:kotherKey];
} //解档
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
_name = [aDecoder decodeObjectForKey:knameKey];
_age = [aDecoder decodeObjectForKey:kageKey];
_weight = [aDecoder decodeDoubleForKey:kweightKey];
_hobby = [aDecoder decodeObjectForKey:khobbyKey];
_others = [aDecoder decodeObjectForKey:kotherKey];
} return self;
} - (id)copyWithZone:(NSZone *)zone {
Student *copy = [[[self class] allocWithZone:zone] init];
copy.name = [self.name copyWithZone:zone];
copy.age = [self.age copyWithZone:zone];
copy.weight = self.weight;
copy.hobby = [self.hobby copyWithZone:zone];
copy.others = [self.others copyWithZone:zone]; return copy;
} @end
归档解档代码:
- (void)archiverDemo {
//获取文件存放的路径
NSString *filePath = [[self documentsPath] stringByAppendingPathComponent:@"student.archiver"]; //将数据归档
Student *stu = [[Student alloc] init];
stu.name = @"田小胖";
stu.age = @"";
stu.weight = 68.0;
stu.hobby = @"coder";
stu.others = [NSDictionary dictionaryWithObjectsAndKeys:@"others",@"other", nil];
//使用NSData存放归档的数据
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeObject:stu forKey:@"student"]; [archiver finishEncoding];
//将归档的信息存放到磁盘上
[data writeToFile:filePath atomically:YES]; }
- (void)getDataFromArchiver {
NSString *getDataPath = [[self documentsPath] stringByAppendingPathComponent:@"student.archiver"];
//读取存放到磁盘上的NSData实例
NSData *saveData = [NSData dataWithContentsOfFile:getDataPath]; //创建解归档的对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:saveData]; Student *stu = [unArchiver decodeObjectForKey:@"student"]; NSLog(@"%@ %@ %f %@ %@",stu.name,stu.age,stu.weight,stu.hobby,stu.others); }
打印结果:
存储方式[:] 田小胖 68.000000 coder {
other = others;
}
以上是iOS中最常见的4种存储方式中的三种,还有一种比较复杂的数据库存储。将在后面的文章中介绍。希望会对看了此文的读者有所帮助。
iOS中的存储方式的更多相关文章
- ios中数据存储方式
以上三种不能存储大批量数据 plist只能先取出来 里面的数据 覆盖存储 SQLLite3 数据库 纯C语言 轻量级 CoreData 基于SQLLite3 OC版本 重量级 大批量数据缓存 SQL ...
- iOS学习——iOS常用的存储方式
不管是在iOS还是Android开发过程中,我们都经常性地需要存储一些状态和数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.根据要存储的的数据的大小.存储性质以及存储类型,在iOS和An ...
- iOS 应用数据存储方式(XML属性列表-plist)
iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) ...
- iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ...
- iOS开发UI篇—ios应用数据存储方式(偏好设置)
iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...
- iOS开发UI篇—ios应用数据存储方式(归档)
iOS开发UI篇—ios应用数据存储方式(归档) 一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同 ...
- iOS 中的加密方式
iOS 中的加密方式 1 加密方式主要有: Base64,MD5,RSA,DES,AES,钥匙串存储,Cookie 2 各加密方式的比较 2.1 Base64 2.1.1 基本原理:采用64个基本的 ...
- iOS开发UI篇—ios应用数据存储方式(归档) :转发
本文转发至:文顶顶http://www.cnblogs.com/wendingding/p/3775293.html iOS开发UI篇—ios应用数据存储方式(归档) 一.简单说明 在使用plist ...
- <转载>浅谈C/C++的浮点数在内存中的存储方式
C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中 ...
随机推荐
- iOS开发之──传感器使用 (转载)
在实际的应用开发中,会用到传感器,下面首先介绍一下iphone4的传感器,然后对一些传感器的开发的API作一简单介绍. AD:WOT2015 互联网运维与开发者大会 热销抢票 在实际的应用开发中,会用 ...
- [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)
温馨提示 建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容. ...
- 【代码笔记】iOS-竖排文字
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...
- 自定义button
改变button内部label和imageView的frame - (CGRect)titleRectForContentRect:(CGRect)contentRect - (CGRect)imag ...
- Safari 快捷键
标签和网页导航快捷键 8 个 切换到下一个标签页 – Control+Tab 切换到上一个标签页 – Control+Shift+Tab 向下滚动一屏 – 空格 向上滚动一屏 – Shift+空格 焦 ...
- [转]Json转换神器之Google Gson的使用
这几天,因为项目的需要,接触了Google的Gson库,发现这个东西很好用,遂记下简单的笔记,供以后参考.至于Gson是干什么的,有什么优点,请各位同学自行百度.话不多说,切入正题: 1. 下载Gso ...
- C#复习④
C#复习④ 2016年6月16日 12:37 Main Classes and Structs 类和结构体 1.Contents of Classes 字段,常量,方法,构造函数,析构函数: 特性,事 ...
- Scrum敏捷项目管理精要
1. 简介: 敏捷项目管理在我们国家起步比较晚,成功运用的项目不多 百分之六十五的敏捷项目用户为scrum 2.互联网时代的特征,雷军的话: 专注,极致,口碑,快(敏捷项目开发就是要快速) 3.敏捷开 ...
- WPF学习之路(九)导航和页面(续)
生命周期 如果Page1成功导航到Page2,首先会触发NavigationService的Navigating事件,标识导航开始.随后创建Page2对象,并且触发NavigationProgress ...
- Third glance in Go
在Go語言裏關於數組(Array),切片(Slice)和映射表(Map)的使用是非常常見的.有過其他語言編程背景的人會比較熟悉一下,但是也是因爲過於的熟悉,從而導致一個慣性思維,往往就會踢到“石頭”, ...