iOS本地数据保存

沙盒介绍:

获取路径参数介绍:

/**

NSSearchPathForDirectoriesInDomains 是用来查找文件路径的函数,其返回值是一个数组,这个数组中只有一个NSString类型元素,这个元素保存的就是查找的路径。

参数1: NSDocumentDirectory 表示需要查找的是Document文件夹

参数2:NSUserDomainMask 表示在用户的主目录中查找

参数3:YES 表示返回路径展开

*/

   iOS 应用程序在安装时,会创建属于自己的沙盒文件,应用程序不能直接访问其他应用程序的沙盒文件,

   当应用程序需要向外部请求或接收数据时,都需要经过权限认证,否则,无法获取到数据。

   应用程序中所有的非代码文件都保存在沙盒中,比如图片、声音、属性列表,sqlite数据库和文本文件等

   沙盒的的根目录有三个文件夹,分别是 Documents,Library,tmp

    

   Documents:中一般保存应用程序本身产生文件数据,例如游戏进度,绘图软件的绘图等, iTunes备份和

   恢复的时候,会包括此目录

   注意:在此目录下不要保存从网络上下载的文件,否则app无法上架

   Documents:路径获取有3种方法

   1.利用字符串拼接,在home目录后面拼接字符串Documents

     //获取家目录     

       NSString*homeDocumentPath = NSHomeDirectory();

     //拼接

      NSString*documents = [homeDocumentPath stringByAppendingPathComponent:@"Documents"];

   2.NSSearchPathForDirectoriesInDomains方法

   NSString*path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,  

    YES).lastObject;

   3.NSFileManager 

     [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory

     inDomains:NSUserDomainMask] lastObject]

   Library:目录下有两个子目录:CachesPreferences

   Library/Caches/(这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息)

   此目录用来保存应用程序运行时生成的需要持久化的数据,这些数据一般存储体积比较大,又不是十分重

   要,比如网络请求数据等。这些数据需要用户负责删除。iTunes同步设备时不会备份该目录。

    路径同样有三种获取方式:

     NSString*homeDocumentPath = NSHomeDirectory();

     1.

      NSString*cachePath =

      [homeDocumentPath stringByAppendingPathComponent:@"Library/Caches"];

      2.

     NSString*path=

      NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,  

      YES).lastObject;

       3.

       [[[NSFileManager defaultManager] URLsForDirectory: NSCachesDirectory    

       inDomains:NSUserDomainMask] lastObject]

   Library/Preferences/(用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息)

  此目录保存应用程序的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。

  iTunes同步设备时会备份该目录

  在Preferences/下不能直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的

  偏好.

   获取路径同上(改一下标红部分即可)

  tmp iTunes不会备份这个目录,用来保存临时数据,应用退出时会清除该目录下的数据

  NSString *tmp = NSTemporaryDirectory();

  

ios 常用的存储方式:

  • NSUserDefaults(存在沙盒的Library/Preferences 目录文件夹里)
  • 归档(序列化)(存在Documents文件夹下以生成data.archive文件形式存在)
  • plist文件(沙盒的Documents中就创建了一个plist文件,并且写入数据保存)
  • 数据库
  • CoreData
  • KeyChain

NSUserDefaults:NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、

                       密码之类的(支持的数据格式有:NSNumber(Integer、Float、Double),NSString,

                        NSDate,NSArray,NSDictionary,BOOL类型).

/**

NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];

//保存值(key值同名的时候会覆盖的)

 [defaults setObject:@"用户名"forKey:kUsernameKey];

//立即保存

[defaults synchronize];

//取值

NSString*username = [defaults objectForKey:kUsernameKey];

*/

另外的保存方法

//保存NSInteger

[defaults setInteger:(NSInteger) forKey:(nonnullNSString*)];

//保存BOOL

[defaults setBool:(BOOL) forKey:(nonnullNSString*)];

//保存NSURL

[defaults setURL:(nullableNSURL*) forKey:(nonnullNSString*)];

//保存float

[defaults setFloat:(float) forKey:(nonnullNSString*)];

//保存double

[defaults setDouble:(double) forKey:(nonnullNSString*)];

//取值

[defaults integerForKey:(nonnullNSString*)];

[defaults boolForKey:(nonnullNSString*)];

[defaults URLForKey:(nonnullNSString*)];

[defaults floatForKey:(nonnullNSString*)];

[defaults doubleForKey:(nonnullNSString*)];


归档(序列化):一般保存自定义的对象,但是只有遵守NSCoding的类才能使用归档

归档保存自定义对象

定义一个Person类,如果想对person进行归档解档,首先要让Person遵守协议

/********Person.h*********/

#import

//遵守NSCoding协议

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, assign) NSInteger age;

//自定义的归档保存数据的方法

+(void)savePerson:(Person *)person;

//自定义的读取沙盒中解档出的数据

+(Person *)getPerson;

@end

NSCoding协议有2个方法:

(void)encodeWithCoder:(NSCoder *)aCoder

归档时调用这个方法,在方法中使用encodeObject:forKey:归档变量。

(instancetype)initWithCoder:(NSCoder *)aDecoder

解档时调用这个方法,在方法中石油decodeObject:forKey读出变量。

/******Person.m*******/

#import "Person.h"

@implementation Person

//归档,Key建议使用宏代替,这里就不使用了

- (void)encodeWithCoder:(NSCoder *)aCoder {

[aCoder encodeObject:self.name forKey:@"name"];

[aCoder encodeInteger:self.age forKey:@"age"];

}

//解档

-(instancetype)initWithCoder:(NSCoder *)aDecoder {

if (self=[super init]) {

self.name = [aDecoder decodeObjectForKey:@"name"];

self.age = [aDecoder decodeIntegerForKey:@"age"];

}

return self;

}

//类方法,运用NSKeyedArchiver归档数据

+(void)savePerson:(Person *)person {

NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;

NSString *path=[docPath stringByAppendingPathComponent:@"Person.plist"];

[NSKeyedArchiver archiveRootObject:person toFile:path];

}

//类方法,使用NSKeyedUnarchiver解档数据

+(Person *)getPerson {

NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;

NSString *path=[docPath stringByAppendingPathComponent:@"Person.plist"];

Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

return person;

}

@end

下面就可以在需要的地方归档或解档Person对象。

/*******ViewController.m*******/

//创建Person对象

Person *person = [Person new];

person.name = @"jack";

person.age = 17;

//归档保存数据

[Person savePerson:person];

//解档拿到数据

Person *resultPerson = [Person getPerson];

//打印出结果,证明归档解档成功

NSLog(@"name = %@, age = %ld",resultPerson.name,resultPerson.age);


  

猜你喜欢

转载自my.oschina.net/fllKevin/blog/1806375