iOS 沙盒文件目录、数据持久化4种方法

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语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值