1、沙盒文件目录
// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory();
每一个APP都有一个存储空间,就是沙盒。APP之间不能相互通信。沙盒根目录结构:.app、Documents、Library、tmp。
(1)、.app包:
这里面存放的是应用程序的源文件,包括资源文件和可执行文件。
NSString *path = [[NSBundle mainBundle] bundlePath];
(2)、/Documents
最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据。
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
(3)、Library(包含Caches、Preferences)
Caches
iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
Preferences
iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
(5)、/tmp:
iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除。
NSString *path = NSTemporaryDirectory();
2、数据持久化(4种方法)
NSUserDefaults(plist)、归档NSKeyedArchiver、SQLite、CoreData
(1)、NSUserDefaults(plist)
原理:NSUserDefaults类提供了与默认数据库相交互的编程接口。其实它存储在应用程序的一个plist文件里,路径为沙盒Document目录平级的/Library/Prefereces里( 即preference目录下生成一个以此应用包名来命名的plist文件)
NSUserDefaults (plist)支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL,NSData
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"jack" forKey:@"firstName"];
[defaults setInteger:10 forKey:@"Age"];
[defaults synchronize];
(2)、归档NSKeyedArchiver
归档(又名序列化),把对象转为“字节码”,以文件的形式存储到磁盘上,程序运行过程中或者再次重新打开程序的时候,可以通过解归档(返序列化)还原这些对象
如果一个自定义的类A,作为另一个自定义类B的一个属性存在;那么,如果要对B进行归档,那么,B要实现NSCoding协议。并且,A也要实现NSCoding协议
#import <Foundation/Foundation.h>
@interface UserModel : NSObject <NSCoding>
@property(nonatomic , assign) NSInteger address_id; //地址id
@property(nonatomic , copy) NSString *mobile; //登录的手机号
@property(nonatomic , copy) NSString *reg_time; //注册时间
@property(nonatomic , copy) NSString *title; //地址-幼儿园名字
@property(nonatomic , copy) NSString *token; //
@property(nonatomic , assign) NSInteger user_id; //用户id
@property(nonatomic , copy) NSString *head_pic; //头像
@property(nonatomic , copy) NSString *push_id; //上传极光推送的id
//
@end
#import "UserModel.h"
@implementation UserModel
//KVC简直编码
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}
//解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.address_id = [aDecoder decodeIntegerForKey:@"address_id"];
self.mobile = [aDecoder decodeObjectForKey:@"mobile"];
self.reg_time = [aDecoder decodeObjectForKey:@"reg_time"];
self.title = [aDecoder decodeObjectForKey:@"title"];
self.token = [aDecoder decodeObjectForKey:@"token"];
self.user_id = [aDecoder decodeIntegerForKey:@"user_id"];
self.head_pic = [aDecoder decodeObjectForKey:@"head_pic"];
self.push_id = [aDecoder decodeObjectForKey:@"push_id"];
}
return self;
}
//归档
- (void)encodeWithCoder:(NSCoder *)aCoder{
//
[aCoder encodeInteger:self.address_id forKey:@"address_id"];
[aCoder encodeObject:self.mobile forKey:@"mobile"];
[aCoder encodeObject:self.reg_time forKey:@"reg_time"];
[aCoder encodeObject:self.title forKey:@"title"];
[aCoder encodeObject:self.token forKey:@"token"];
//
[aCoder encodeInteger:self.user_id forKey:@"user_id"];
[aCoder encodeObject:self.head_pic forKey:@"head_pic"];
[aCoder encodeObject:self.push_id forKey:@"push_id"];
}
@end
//归档
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:userModel];
UserDefault_SaveData(myEncodedObject, @"userInfor");
//解档
NSData *myEncodedObject = UserDefault_ObjectForKey(@"userInfor");
if (myEncodedObject) {
UserModel *obj = (UserModel *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
}
//沙盒 NSUserDefaults 实例化 存到本地
#define UserDefault_SaveData(_object_,_key_) \
[[NSUserDefaults standardUserDefaults] setObject:_object_ forKey:_key_]; \
[[NSUserDefaults standardUserDefaults] synchronize];\
//从本地获得存储的对象
#define UserDefault_ObjectForKey(_key_) \
[[NSUserDefaults standardUserDefaults] objectForKey:_key_]; \
//删除本地存储的对象
#define Remove_ObjectForKey(_key_) \
[[NSUserDefaults standardUserDefaults] removeObjectForKey:_key_];\
[[NSUserDefaults standardUserDefaults] synchronize];\
(3)、SQLite
基于C语言开发的轻型数据库
在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libqlite3框架基于C语言编写)
(4)、Core Data
Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句