[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之前内容高度为:屏幕高度 - ...
随机推荐
- git设置对比工具
windows下设置 beyond compare 3 为 git 的对比工具. 首先需要先安装 beyond compare 3 工具,切记需要安装安装版的,不要搞绿色版的. mac下使用 Kal ...
- socket编程---一个简单例子
服务器端代码(单线程): import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRe ...
- datatables 服务器返回数据后的处理-表格数据属性的操作方法(ajax.dataSrc)
http://dt.thxopen.com/reference/option/ajax.dataSrc.html http://datatables.net/reference/option/ajax ...
- 【C#学习笔记】读SQL Server2008
using System; using System.Data.SqlClient; namespace ConsoleApplication { class Program { static voi ...
- Darwin Streaming Server 安裝操作備忘
Darwin Streaming Server 安裝操作 Darwin Streaming Server是蘋果公司推出的開放源碼.跨平台多媒體串流伺服器, 提供音樂 (mp3) 與影音 (3gp.mp ...
- Android设计模式之命令模式、策略模式、模板方法模式
命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...
- Struts2的OGNL标签详解
一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...
- BasicDataSource配备
BasicDataSource配置 commons DBCP 配置参数简要说明 前段时间因为项目原因,要在修改数据库连接池到DBCP上,折腾了半天,有一点收获,不敢藏私,特在这里与朋友们共享. 在配置 ...
- CocoaPods一个Objective-C第三方库的管理利器
转:http://blog.csdn.net/totogo2010/article/details/8198694 介绍: 开发应用的时候第三方的库是不可缺少的,能提高开发的效率. 一些经常用到的库, ...
- ViewPager 滑动页(三)
需求:滑动展示页,能够使用本地数据,及获取服务器数据进行刷新操作,当滑动到最后一页时,结束当前activity,进入下一个activity: 效果图: 实现分析: 1.目录结构: 代码实现: 1.Po ...