ios数据存储的5种方式
- NSUserDefaults(Preference偏好设置)
- plist存储
- 归档
- SQLite3
- CoreData
应用沙盒
每个App的沙河目录结构, 都如下图所示:
沙盒目录
默认情况下, 每个沙盒含有1个应用程序包和三个文件夹: Documents, Library和tmp. 因为沙盒机制, 应用只能在这几个目录读写文件.
MyApp.app:
应用程序包, 这里面存放的是应用程序文件, 包括资源文件和可执行文件.
访问路径:
//object-c
NSString *budlePath = [[NSBundle mainBundle] bundlePath];
//swift
let bundlePath = Bundle.main.bundlePath
Documents:
应用程序在运行时生成的一些需要长久保存的数据(比如: 个人设置等信息), 通过iTunes, iCloud备份时,会备份这个目录下的数据, 此目录下保存相对重要的数据.
//object-c
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
//swift
let path = NSHomeDirectory() + "/Documents"
let path2 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
Library/Caches
从网络上下载的文件或数据(如: 音乐缓存, 图片缓存等) , 此目录下的数据某些情况下会自动删除, 需要程序员手动清除该目录下的数据. ITunes, iCloud备份时不会备份此目录下的数据.一般用于存储体积不大, 不需要备份的非重要资源数据.
In iOS 5.0 and later, the system may delete the Caches
directory on rare occasions when the system is very low on disk space. This will never occur while an app is running. However, be aware that restoring from backup is not necessarily the only condition under which the Caches directory can be erased.
//object-c
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* cachesDirectory = [paths objectAtIndex:0];
//swift
let path = NSHomeDirectory() + "/Library/Caches"
let path2 = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
Library/Preferences
保存应用程序的偏好设置文件(使用NSUerDefaults类设置是创建, 不应该手动创建), iTunes, iCloud备份时会备份此目录下的数据.该目录由系统自动管理,通常用来储存一些基本的应用配置信息,比如账号密码,自动登录等。
tmp
保存应用运行时产生的一些临时数据,应用程序退出,系统磁盘空间不够,手机重启时,都会自动清除该目录的数据。无需程序员手动清除该目录中的数据.iTunes、iCloud备份时,不会备份次目录。
//object-c
NSString *tempPath = NSTemporaryDirectory();
//swift
let path = NSTemporaryDirectory()
获取沙盒路径
Document:
//Document path
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
//Library path
NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0];
//caches path
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//Preferences path
NSString*preferencePath = [libraryPath stringByAppendingString:@"/Preferences"];
//tem path
NSString *tmpPath = NSTemporaryDirectory();
//app path
NSString *appPath = [[NSBundle mainBundle] bundlePath];
NSuserDefault
NSuserDefault
适合存储轻量级的本地数据,支持的数据类型有:NSNumber,NSString,NSDate,NSArray,NSDictionary,BOOL,NSData
沙盒路径为 Library/Preferences
文件格式为 .plist
优点:
- 不需要关心文件名
- 快速进行键值对存储
- 直接存储基本数据类型
缺点:
- 不能存存取自定义数据类型,如果需要支持,需要自定义数据转为支持的类型;比如实现NSCoding协议的encodeWithCoder、initWithCoder。
- (IBAction)userDefaultSave:(id)sender {
NSArray *testArray = @[@"test1", @"test2", @"test3"];
[[NSUserDefaults standardUserDefaults] setObject:testArray forKey:@"arrayKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (IBAction)userDefaultLoad:(id)sender {
NSArray *testArray = [[NSUserDefaults standardUserDefaults] objectForKey: