iOS数据存储

进入正题之前,先要了解iOS的>沙盒(sandbox)<

  • 它的特点如下:
    1.每个程序都在自己的沙盒内
    2.不能随意跨越沙盒去访问别的程序沙盒内容
    3.应用程序向外请求或者获取数据都要经过权限认证
    4.所有非代码文件都保存在沙盒内,比如图片,声音,属性文件等.
    不难看出,沙盒机制让iOS相对其他系统更加安全,让程序之间的通讯受到管理.

  • 沙盒中的目录结构:

iOS沙盒目录.png

1.Documents
存放内容:程序运行时生成的一些需要长久保存的,不可再生的数据(游戏进度,应用程序个人设置等)
是否会被iTunes同步:会

2.Library
2.1.Library/Caches
存放内容:用户使用过程中的缓存文件,可再生(网络请求数据),App需要有对应的删除Caches的功能.
是否会被iTunes同步:不会

2.2Library/Preference:应用程序的偏好文件,使用>NSUserDefaults<保存的设置数据都会保存在这个文件夹下.
是否会被iTunes同步:会

3.tmp
存放内容:各种临时文件,App再次运行时主动删除,系统也会在磁盘空间不足时主动清理.
是否会被iTunes同步:不会

获取沙盒相关目录路径

获取沙盒目录

NSHomeDirectory()

获取tmp目录

NSTemporaryDirectory()

获取Documents和Library目录

NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)

这个方法用户返回指定范围内的指定目录的路径,包括三个参数:
1.directory:要搜索的目录名称,比如使用NSDocumentDirectory表明想要查找Documents目录;使用NSCachesDirectory表明想要查找Library/Caches目录

2.domainMask:指定搜索范围,比如使用NSUserDomainMask表明想要在当前应用沙盒目录下查找;NSLocalDomainMask表明想要查找/Library等.

3.expandTilde:返回一个BOOL值,表示是否展开"~"符号,返回全路径

//返回YES
"/Users/mac/Library/Developer/CoreSimulator/Devices/466710BC-3138-45F4-ADCD-FC14379107AC/data/Containers/Data/Application/EB044A4C-1454-4A12-BBB1-EF14E06C681F/Documents"
//返回NO
"~/Documents"

数据存储

plist

拼接文件路径和名称

[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"fileName.plist"];
  • 存储数据:
[dataArray writeToFile:filePath atomically:YES];

第一个参数: 文件全路径
第二个参数: YES, 在写入文件的时候, 会先写入一个临时文件, 当所有数据完成写入过之后, 会把这个文件名修改为要保存的文件名, 如果写入失败, 则不修改.

  • 读取数据:
[NSArray arrayWithContentsOfFile:filePath]

可以调用writeToFile的类:

可以调用WriteToFile的类.png

NSUserDefaults

  • 很多iOS应用都支持偏好设置,比如保存用户名/密码/字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能,

  • 每个应用都有个NSUserDefaults实例,它是一个单例对象,通过它来存取偏好设置,设置信息都是键值对的形式,

  • UserDefaults主要用来存储用户系统的设备信息,但有的时候也可以在程序的任何地方用来存储>轻量级<数据,作为全局数据来访问.

  • 不用程序猿管理存储的目录和路径

  • 存储数据:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"Key"];

  • 读取数据:
 [[NSUserDefaults standardUserDefaults] boolForKey:@"Key"];

UserDefaults支持的数据类型:

UserDefaults支持的数据类型.png

归档&解档

要了解归档/解档,需要先了解NSCoding协议,苹果官方给出的描述如下:

  • The NSCoding protocol declares the two methods that a class must implement so that instances of that class can be encoded and decoded. This capability provides the basis for archiving (where objects and other structures are stored on disk) and distribution (where objects are copied to different address spaces).
  • NSCoding协议声明了两个方法,一个类想要实现归档/解档必须要遵守NSCoding协议.一旦遵守,就可以归档(对象存储在磁盘上)和解档(对象可以复制到不同的位置)

需要注意的是:所有原生的类都已经遵守了<NSSecureCoding>协议,所以可以直接归档/解档

  • 存储数据:
[NSKeyedArchiver archiveRootObject:object toFile:filePath];
  • 读取数据:
[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

如果是自定义类:Person

@interface Person : NSObject <NSCoding>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign)NSInteger age;
@end

想要归档/解档,除了要遵守NSCoding协议,还要在>类内部<实现两个方法:

  • 归档器:
 -(void)encodeWithCoder:(NSCoder *)aCoder {

    [aCoder encodeObject:self.name forKey:@"name"];
    
    [aCoder encodeInteger:self.age forKey:@"age"]; 
}
  • 解档器
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    [aDecoder decodeObjectForKey:@"name"];
    
    [aDecoder decodeObjectForKey:@"age"];
    
    return self;
}

数据库

  • 有别于系统提供的数据存储方式,可以进行大批量数据的增/删/改/查.
  • 数据库结构类似Excel表格
  • iOS系统使用的是轻量级的SQLite数据库

篇幅较大,以后专门开一篇博来分享.

最后:谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • iOS数据存储 持久化存储 概述: 持久化存储——将数据保存在硬盘里,当应用程序重启后可以访问到之前存储的数据。是...
    夏天的风_song阅读 615评论 1 7
  • 本文将对以下几个模块进行总结 下图是Core Data堆栈的图示,在这里是为了做文章的封面图片,后文会介绍Core...
    MR_THT阅读 1,025评论 0 3
  • 数据存储 iOS应用数据存储的常用方式 - XML属性列表(plist)归档 - Preference(偏好设置)...
    Hevin_Chen阅读 219评论 0 0
  • 常用的数据存储方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiv...
    彡廿阅读 161评论 0 0
  • 对于很多新人来讲,能接收输入法输入的内容大概只有EditText和TextView这两个控件了,其实不然,只要是V...
    学海摆渡人阅读 6,424评论 11 15