[iOS基础控件 - 6.11.5] 沙盒 & 数据存储
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据
Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
NSString *home = NSHomeDirectory();
// YES 代表展开路径中的波浪字符“~”
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
// 在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素
Library/Caches:(跟Documents类似的2种方法)
利用沙盒根目录拼接”Caches”字符串
利用NSSearchPathForDirectoriesInDomains函数(将函数的第2个参数改为:NSCachesDirectory即可)
- xml属性列表(plist)归档
- Preference(偏好设置)
- NSKeyedArchiver归档
- SQLite3数据库(关系型数据库)
- Core Data
// 将数据封装成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"母鸡" forKey:@"name"];
[dict setObject:@"15013141314" forKey:@"phone"];
[dict setObject:@"27" forKey:@"age"];
// 将字典持久化到Documents/stu.plist文件中
// 读取Documents/stu.plist的内容,实例化NSDictionary
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
NSLog(@"name:%@", [dict objectForKey:@"name"]);
NSLog(@"phone:%@", [dict objectForKey:@"phone"]);
NSLog(@"age:%@", [dict objectForKey:@"age"]);
打印信息如下
- (IBAction)save { // NSString *path = @"/Users/hellovoidworld/Library/Developer/CoreSimulator/Devices/87B56173-7E1C-466A-A03E-1CB2160B88E3/data/Containers/Data/Application/7FB97B7E-5A67-498D-AA0B-A8FCEDE19121/Documents"; // 1.获得沙盒路径
NSString *path = NSHomeDirectory(); // 2.Document路径
NSString *docPath = [path stringByAppendingPathComponent:@"Documents"]; // 3.新建数据
NSArray *data = @[@"jack", @, @"aaaaa"];
NSString *filePath = [docPath stringByAppendingPathComponent:@"data.plist"]; NSLog(@"%@", filePath); [data writeToFile:filePath atomically:YES];
} - (IBAction)read {
// 1.获得沙盒路径
NSString *path = NSHomeDirectory(); // 2.Document路径
NSString *docPath = [path stringByAppendingPathComponent:@"Documents"]; NSString *filePath = [docPath stringByAppendingPathComponent:@"data.plist"]; NSArray *array = [NSArray arrayWithContentsOfFile:filePath]; NSLog(@"%@", array);
}
每个应用都有个NSUserDefaults实例,通过它来存取偏好设置
比如,保存用户名、字体大小、是否自动登录
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"itcast" forKey:@"username"];
[defaults setFloat:18.0f forKey:@"text_size"];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *username = [defaults stringForKey:@"username"];
float textSize = [defaults floatForKey:@"text_size"];
BOOL autoLogin = [defaults boolForKey:@"auto_login"];
注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入
- (IBAction)preferenceSave {
// 1.利用NSUserDefaults,就能直接访问app的偏好设置(Library/Preferences)
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 2.存储数据
[defaults setObject:@"simon" forKey:@"name"];
[defaults setInteger: forKey:@"age"];
[defaults setBool:YES forKey:@"true"]; // 3.立刻同步
[defaults synchronize];
} - (IBAction)preferenceRead {
// 1.利用NSUserDefaults,就能直接访问app的偏好设置(Library/Preferences)
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 2.读取数据
NSString *name = [defaults objectForKey:@"name"];
int age = [defaults integerForKey:@"age"];
BOOL t = [defaults boolForKey:@"true"]; NSLog(@"%@ - %d - %d", name, age, t);
}
- 需要存储的属性
- 存储方式
NSString *path = @"/Users/hellovoidworld/Study/iOS/0410";
// 扩展名.data只是我随便取的
- 需要读取的属性
- 读取方法
encodeWithCoder:
应该在encodeWithCoder:方法中加上一句
[super encodeWithCode:encode];
确保继承的实例变量也能被编码,即也能被归档
应该在initWithCoder:方法中加上一句
self = [super initWithCoder:decoder];
//
// Person.h
// Archive
//
// Created by hellovoidworld on 14/12/25.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// #import <Foundation/Foundation.h> @interface Person : NSObject <NSCoding> @property(nonatomic, copy) NSString *name;
@property(nonatomic, assign) int age;
@property(nonatomic, assign) double height; @end
//
// Person.m
// Archive
//
// Created by hellovoidworld on 14/12/25.
// Copyright (c) 2014年 hellovoidworld. All rights reserved.
// #import "Person.h" @implementation Person #pragma mark - 将对象归档的时候调用的协议方法
/**
* 哪些属性需要存储
* 用什么方法存储
*/
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt:_age forKey:@"age"];
[aCoder encodeDouble:_height forKey:@"height"];
} #pragma mark - 从文件读取对象调用的协议方法
/**
* 哪些属性需要读取
* 用什么方法读取
*/
- (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntForKey:@"age"];
self.height = [aDecoder decodeDoubleForKey:@"height"];
} return self;
} @end
- (IBAction)objectSave {
// 指定保存路径
NSString *path = @"/Users/hellovoidworld/Study/iOS/0410"; // 扩展名.data只是我随便取的
NSString *filePath = [path stringByAppendingPathComponent:@"p.data"]; // 创建一个对象
Person *p = [[Person alloc] init];
p.name = @"simon";
p.age = ;
p.height = 166.00; // 存储到文件
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
} - (IBAction)objectRead {
// 指定文件路径
NSString *filePath = @"/Users/hellovoidworld/Study/iOS/0410/p.data"; // 读取文件
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; NSLog(@"%@ - %d - %f", p.name, p.age, p.height);
}
[iOS基础控件 - 6.11.5] 沙盒 & 数据存储的更多相关文章
- [iOS基础控件 - 6.11.3] 私人通讯录Demo 控制器的数据传递、存储
A.需求 1.搭建一个"私人通讯录"Demo 2.模拟登陆界面 账号 密码 记住密码开关 自动登陆开关 登陆按钮 3.退出注销 4.增删改查 5.恢复数据(取消修改) 这个代码 ...
- [iOS基础控件 - 6.11.4] storyboard 的 Segue
A.概念 storyboard中的跳转事件连线,都是一个UIStoryboardSegue对象(Segue) 来源控制器 触发控制器 目标控制器 跳转到的控制器 Seg ...
- [iOS基础控件 - 6.6] 展示团购数据 自定义TableViewCell
A.需求 1.头部广告 2.自定义cell:含有图片.名称.购买数量.价格 3.使用xib设计自定义cell,自定义cell继承自UITableViewCell 4.尾部“加载更多按钮”,以及其被点击 ...
- [iOS基础控件 - 6.11.2] - UINavigationController 多控制器 简单使用
A.概念 1.通常一个app有多个控制器 2.需要对这些控制器进行管理 3.有多个view的时候,用一个父view去管理多个子view 4.控制器管理也是如此,使用给一个父控制器,去控制子控制器 ...
- [iOS基础控件 - 6.11.1] - 控制器 & 控制器view
A.控制器的创建 控制器常见的创建方式有以下几种通过storyboard创建 直接创建 ViewController *vc = [[ViewController alloc] init]; ...
- [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)
A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不 ...
- iOS 基础控件(下)
上篇介绍了UIButton.UILabel.UIImageView和UITextField,这篇就简短一点介绍UIScrollView和UIAlertView. UIScrollView 顾名思义也知 ...
- [iOS基础控件 - 7.0] UIWebView
A.基本使用 1.概念 iOS内置的浏览器控件 Safari浏览器就是通过UIWebView实现的 2.用途:制作简易浏览器 (1)基本请求 创建请求 加载请求 (2)代理监听webView加载, ...
- [iOS基础控件 - 6.12.1] QQ菜单管理 UITabBarController 控制器管理
A.需求 1.类似QQ.微信顶部或者底部的窗口转换导航条 2.给每个页面添加相应内容 B.UITabBarController 1.基本概念: (1)内容高度 iOS7之前内容高度为:屏幕高度 - ...
随机推荐
- 自定义sublime代码片段
sublime text 已经有一些他们内置的一些代码片段,但是有时候,这些并不能满足我们,这就需要我们自定义一些代码片段. 步骤如下: 1.打开sublime text 2.选择 tools -&g ...
- topcoder srm 628 div2 250 500
做了一道题,对了,但是还是掉分了. 第二道题也做了,但是没有交上,不知道对错. 后来交上以后发现少判断了一个条件,改过之后就对了. 第一道题爆搜的,有点麻烦了,其实几行代码就行. 250贴代码: #i ...
- poj 3101 Astronomy (java 分数的最小公倍数 gcd)
题目链接 要用大数,看了别人的博客,用java写的. 题意:求n个运动周期不完全相同的天体在一条直线上的周期. 分析:两个星球周期为a,b.则相差半周的长度为a*b/(2*abs(a-b)),对于n个 ...
- 宏HASH_SEARCH
/********************************************************************//** Looks for a struct in a ha ...
- CSS效果
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...
- 使用Spring时遇到的bug及解决
1.myeclipse中Spring 不给提示 解决:(1)window – preferences – myeclipse – files and editors – xml – xml catal ...
- fmri降噪,利用spatial+temporal信息
1.基于小波+高斯模型 <SPATIOTEMPORAL DENOISING AND CLUSTERING OF FMRI DATA>
- Window 下 VFW 视频采集与显示
引言 经过几天的努力终于将VFW视频采集与显示功能完整实现了,不得不说网上对这方面完整的详细讲解文章是在太少了.所以就要本人来好好总结一下让后来者不再像我一样折腾好久.在本文中我将详细讲解VFW视频采 ...
- Library cache lock/pin详解
Library cache lock/pin 一.概述 ---本文是网络资料加metalink 等整理得来一个实例中的library cache包括了不同类型对象的描述,如:游标,索引,表,视图,过程 ...
- 是时候学习Android分屏开发了
今年Google发布了Android N,Android N新增了不少功能,最受关注的自然就是分屏了. 这一功能对国内的很多手机用户并不陌生,其实很多第三方系统早已经实现了这一功能,如EMUI,Fly ...