ios存储机制分类
XML属性列表(Property List 常简称为PList)
偏好设置
沙盒文件
对象归档
CoreData
KeyChain
SQLite
XML属性列表-Property List
Property List这一类型的文件,通常用来存放简单的结构数据,如应用程序的设置。Property List是一个XML格式的文件。如果你之前在Mac或iPhone编辑过配置文件,可能看到过.plist
后缀的文件,它们就是Property List的应用。Property List中存放的数据类型是有限制的,包括数组(Array)、字典(Dictionary)、字符串(String)等。
创建Property List:在模拟器中点击Xcode-New File-Resource-Property List 创建Property List文件。在左侧工程导航栏中点击该文件,即可在模拟器右侧编辑该文件:AddRow添加新值,
所有值均为Key-Value对。如果需要查看plist文件的数据结构,可以右击XXX.plist文件,并选择Open as Source Code来查看Property List所存放的内容。
读取Property List:ios SDK提供了从plist读取数据的方法,可对该文件直接进行读写操作。
代码如下:
NSString *path = [[NSBundle mainBundle] pathForResource:@"recipes" ofType:@"plist"]; // Find out the path of recipes.plist
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; // Load the file content and read the data into arrays
tableData = [dict objectForKey:@"RecipeName"];
thumbnails = [dict objectForKey:@"Thumbnail"];
prepTime = [dict objectForKey:@"PrepTime"];
NSUserDefaults 偏好设置
专门用来保存应用程序设置和属性、用户保存的数据,如偏好设置:用户名、字体大小、是否自动登录,一般不建议在偏好设置中保存其他数据。用户再次打开程序或者开机后这些数据仍然存在。
NSUserDefaults可以存储的数据类型有:NSData、NSString、NSNumber、NSData、NSArray、NSDictionary。如果要存储其他数据类型,需要先转换为前面的类型,才能用NSUserDefaults存储。
NSUserDefaults数据存取:
//保存数据
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString *name =@”default string“;
[defaults setObject: name forKey:@"name"];
//读取数据
沙盒文件
每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,ios系统不允许访问其他应用的应用沙盒。在ios8中已经开放访问。
应用沙盒一般包括以下几个文件目录:应用程序包、Documents、Libaray(下面有Caches和Preferences目录)、tmp。
应用程序包:包含所有的资源文件和可执行文件。
Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也有可能会清除该目录下的文件,iTunes不会同步该目录。iphone重启时,该目录下的文件会丢失。
Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录。
Libaray/Caches: 存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除。一般存放体积比较大,不是特别重要的资源。
Libaray/Preferences: 保存应用的所有偏好设置,ios的Settings(设置)应用会在该目录中查找应用的设置信息,iTunes会自动备份该目录。
沙盒文件目录获取代码:
//Home目录
NSString *homeDirectory = NSHomeDirectory();
//Document目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
//Cache目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
//Libaray目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
//tmp目录
NSString *tmpDir = NSTemporaryDirectory();
NSKey的Archiver对象归档-存储自定义对象
偏好设置和plist一般只适用于系统自带的数据类型,用来存储应用的设置信息。归档解决了存储类型的问题,支持存储自定义对象。
使用过程:指定归档文件路径-保存自定义对象到文件中 制定归档文件路径-读取归档文件内容。保存对象到文件使用archiveRootObject:obj toFile:filePath方法。读取数据使用unarchiveObjectWithFile:filePath方法。
使用归档的实体类必须继承<NSCoding>协议,在实体类的.m文件中实现 -(void)encodeWithCoder:(NSCoder *)aCoder和-(id)initWithCoder:(NSCoder *)aDecoder代理。
ps:上面讲的自定义数据类型存取目前还没有使用过,资料均来自网络,觉得不难用。使用过的是将可变字典数据归档的方式保存本地,读取之后仍然可以保持字典的可编辑性。赞一下。
代码如下:将字典归档:
NSMutableData *dataTest = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dataTest];
[archiver encodeObject:params forKey:@"TABLES"];//params为可变字典
[archiver finishEncoding];
[dataTest writeToFile:creatTableFile atomically:YES];//写入creatTableFile 目录文件下
读取可变字典:
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:creatTableFile];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSMutableDictionary *dictionaryTest = [unarchiver decodeObjectForKey:@"TABLES"];
[unarchiver finishDecoding];
PS:归档的形式保存数据,只能一次归档保存以及一次性解压。针对数据量比较小的情况,而且数据操作比较笨拙,如果需要改动数据的某一小部分,
还是需要解压珍格格数据之后归档整个数据。但是相对比较安全,普通方式打开,显示乱码。个人感觉可以用来保存对安全性有要求的小数据量的自定义对象,可以弥补数据库加密会严重影响程序性能的不足。
KeyChain
//获取keyChain某个属性的值
KeychainItemWrapper *keychain=KeychainItemWrapper alloc] initWithIdentifier:@"conference"accessGroup:@"Conference"];
NSString *rememberStatus = [keychain objectForKey:CFBridgingRelease(kSecAttrDescription)]; //此处读取的是SecItem中属性kSecAttrDescription的值
//写入属性值
[keychain setObject:@"NONE" forKey:CFBridgingRelease(kSecAttrLabel)]; //为属性kSecAttrLabel赋值
PS:安全性有保障。
SQLite
之前有专门写SQLite的帖子——ios开发之SQLite
XML属性列表(Property List 常简称为PList)
偏好设置
沙盒文件
对象归档
CoreData
KeyChain
SQLite
XML属性列表-Property List
Property List这一类型的文件,通常用来存放简单的结构数据,如应用程序的设置。Property List是一个XML格式的文件。如果你之前在Mac或iPhone编辑过配置文件,可能看到过.plist
后缀的文件,它们就是Property List的应用。Property List中存放的数据类型是有限制的,包括数组(Array)、字典(Dictionary)、字符串(String)等。
创建Property List:在模拟器中点击Xcode-New File-Resource-Property List 创建Property List文件。在左侧工程导航栏中点击该文件,即可在模拟器右侧编辑该文件:AddRow添加新值,
所有值均为Key-Value对。如果需要查看plist文件的数据结构,可以右击XXX.plist文件,并选择Open as Source Code来查看Property List所存放的内容。
读取Property List:ios SDK提供了从plist读取数据的方法,可对该文件直接进行读写操作。
代码如下:
NSString *path = [[NSBundle mainBundle] pathForResource:@"recipes" ofType:@"plist"]; // Find out the path of recipes.plist
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; // Load the file content and read the data into arrays
tableData = [dict objectForKey:@"RecipeName"];
thumbnails = [dict objectForKey:@"Thumbnail"];
prepTime = [dict objectForKey:@"PrepTime"];
NSUserDefaults 偏好设置
专门用来保存应用程序设置和属性、用户保存的数据,如偏好设置:用户名、字体大小、是否自动登录,一般不建议在偏好设置中保存其他数据。用户再次打开程序或者开机后这些数据仍然存在。
NSUserDefaults可以存储的数据类型有:NSData、NSString、NSNumber、NSData、NSArray、NSDictionary。如果要存储其他数据类型,需要先转换为前面的类型,才能用NSUserDefaults存储。
NSUserDefaults数据存取:
//保存数据
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString *name =@”default string“;
[defaults setObject: name forKey:@"name"];
//读取数据
NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
NSString *name = [defaults objectForKey:@"name"];//根据键值取出
name
PS:使用偏好设置对数据进行保存之后,它保存到系统的时间是不确定的,会在将来某一个时间点自动将数据保存到沙盒文件Preferences文件目录下,如果需要即刻保存数据,可以使用[defaults synchronize]。
PS:使用偏好设置对数据进行保存之后,它保存到系统的时间是不确定的,会在将来某一个时间点自动将数据保存到沙盒文件Preferences文件目录下,如果需要即刻保存数据,可以使用[defaults synchronize]。
每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,ios系统不允许访问其他应用的应用沙盒。在ios8中已经开放访问。
应用沙盒一般包括以下几个文件目录:应用程序包、Documents、Libaray(下面有Caches和Preferences目录)、tmp。
应用程序包:包含所有的资源文件和可执行文件。
Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也有可能会清除该目录下的文件,iTunes不会同步该目录。iphone重启时,该目录下的文件会丢失。
Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录。
Libaray/Caches: 存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除。一般存放体积比较大,不是特别重要的资源。
Libaray/Preferences: 保存应用的所有偏好设置,ios的Settings(设置)应用会在该目录中查找应用的设置信息,iTunes会自动备份该目录。
沙盒文件目录获取代码:
//Home目录
NSString *homeDirectory = NSHomeDirectory();
//Document目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
//Cache目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
//Libaray目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
//tmp目录
NSString *tmpDir = NSTemporaryDirectory();
NSKey的Archiver对象归档-存储自定义对象
偏好设置和plist一般只适用于系统自带的数据类型,用来存储应用的设置信息。归档解决了存储类型的问题,支持存储自定义对象。
使用过程:指定归档文件路径-保存自定义对象到文件中 制定归档文件路径-读取归档文件内容。保存对象到文件使用archiveRootObject:obj toFile:filePath方法。读取数据使用unarchiveObjectWithFile:filePath方法。
使用归档的实体类必须继承<NSCoding>协议,在实体类的.m文件中实现 -(void)encodeWithCoder:(NSCoder *)aCoder和-(id)initWithCoder:(NSCoder *)aDecoder代理。
ps:上面讲的自定义数据类型存取目前还没有使用过,资料均来自网络,觉得不难用。使用过的是将可变字典数据归档的方式保存本地,读取之后仍然可以保持字典的可编辑性。赞一下。
代码如下:将字典归档:
NSMutableData *dataTest = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dataTest];
[archiver encodeObject:params forKey:@"TABLES"];//params为可变字典
[archiver finishEncoding];
[dataTest writeToFile:creatTableFile atomically:YES];//写入creatTableFile 目录文件下
读取可变字典:
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:creatTableFile];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSMutableDictionary *dictionaryTest = [unarchiver decodeObjectForKey:@"TABLES"];
[unarchiver finishDecoding];
PS:归档的形式保存数据,只能一次归档保存以及一次性解压。针对数据量比较小的情况,而且数据操作比较笨拙,如果需要改动数据的某一小部分,
还是需要解压珍格格数据之后归档整个数据。但是相对比较安全,普通方式打开,显示乱码。个人感觉可以用来保存对安全性有要求的小数据量的自定义对象,可以弥补数据库加密会严重影响程序性能的不足。
Core Data -对象型数据库
Core Data是ios3.0以后引用的数据持久化解决方案,其实质是SQLite的封装。提供一些可视化的编辑界面,开发者不需要接触SQL语句,就可以对数据库进行操作。有model、Entity、Attribute属性,
分别相当于数据库中的结构:表、属性和关系。
木有用过,一般直接使用SQLite,有兴趣的童鞋可以参考下面两个网址:
KeyChain
在ios开发中,keyChain服务属于ios中的Security框架,一般使用keyChain来保存用户密码。keyChain提供一种安全的保存私密信息(密码、序列号、证书等)的方式。每个
ios程序都有一个独立的keyChain存储,在Security.framework的SecItem.h文件中,有系统定义的大量属性,用户可以用它们来存储自己的数据。从ios3.0开始,跨程序分享
keyChain变得可行。
需添加Security.framework,目前有开源的keyChain操作类:KeychainItemWrapper ,可以使用它的接口使用keyChain服务。
相关代码示例:
//获取keyChain某个属性的值
KeychainItemWrapper *keychain=KeychainItemWrapper alloc] initWithIdentifier:@"conference"accessGroup:@"Conference"];
NSString *rememberStatus = [keychain objectForKey:CFBridgingRelease(kSecAttrDescription)]; //此处读取的是SecItem中属性kSecAttrDescription的值
//写入属性值
[keychain setObject:@"NONE" forKey:CFBridgingRelease(kSecAttrLabel)]; //为属性kSecAttrLabel赋值
PS:安全性有保障。
SQLite
之前有专门写SQLite的帖子——ios开发之SQLite