美文网首页
数据持久化存储

数据持久化存储

作者: 冷武橘 | 来源:发表于2020-04-19 21:34 被阅读0次

一、沙盒目录

屏幕快照 2018-04-02 下午3.36.28.png

Documents:保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录

Library/Caches:保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份该目录。⼀一般存储体积大、不需要备份的非重要数据

Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置) 应⽤会在该⺫录中查找应⽤的设置信息。iTunes同步设备时会备份该目录

tmp:保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会备份该目录

//获取沙盒根目录
    NSString *rootfilepath=NSHomeDirectory();
    NSLog(@"%@",rootfilepath);

 //搜索用户文件下有哪些Document,在ios开发中只有一个元素匹配
   NSArray *array =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
 //获取Document的路径
   NSString *path =array.lastObject;// NSString *path =array.firstObject;

二、plist文件

1. 存入到plist文件中
   NSArray *array=@[@"1",@"24"];
   //1.获取Document目录路径
    NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    
   //2.拼接文件名
    NSString *filepath=[path stringByAppendingString:@"/a.plist"];
    
    //3.写入文件
    [array writeToFile:filepath atomically:YES];
  
2.读取plist文件
 //1.获取Document目录路径
    NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;

    //2.拼接文件名
    NSString *filepath=[path stringByAppendingPathComponent:@"a.plist"];
    
    //3.读取plist
    NSArray *array=[NSArray arrayWithContentsOfFile:filepath];

三、NSUserDefaults

NSUserDefaults的本质其实就是一个字典型的plist文件。


屏幕快照 2018-04-02 下午4.18.30.png
 //1.获取NSUserDefaults单例
    NSUserDefaults *userdefault=[NSUserDefaults standardUserDefaults];
    
    //2.写入NSUserDefaults中
    [userdefault setInteger:1 forKey:@"A"];
    [userdefault setObject:@"10" forKey:@"age"];
    [userdefault setBool:YES forKey:@"QQ"];

    //ios7后,就不需要synchronize
    [userdefault synchronize];
    
    //3.从NSUserDefaults中读取
    [userdefault boolForKey:@"A"];
    [userdefault objectForKey:@"age"];
    [userdefault integerForKey:@"QQ"];

四、归档、解档(存储自定义对象)

- (void)viewDidLoad {
   [super viewDidLoad];
   NSString *path=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
   NSString *filepath=[path stringByAppendingPathComponent:@"person.data"];
   d.name=@"dog";
   Person *p=[[Person alloc]init];
   p.age=@"11";
   p.name=@"2";
   //归档
   [NSKeyedArchiver archiveRootObject:p toFile:filepath];
   //解档
   Person *p1= [NSKeyedUnarchiver unarchiveObjectWithFile:filepath];
   NSLog(@"%@",p1.dog.name);
/*
执行了NSKeyedArchiver,会自动调用保存对象的encoderWithCoder方法,需要在自定义对象里重写实现-(void)encodeWithCoder:(NSCoder *)aCoder方法目的是告诉他保存该对象的哪些属性;否则会崩溃。
执行了NSKeyedUnarchiver,会自动调用保存对象的initWithCoder方法,需要在自定义对象里重写实现- (instancetype)initWithCoder:(NSCoder *)aDecoder方法目的是告诉他保存该对象的哪些属性;否则会崩溃。
*/
}


#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCoding>
@property(nonatomic, strong) NSString *name;
@property(nonatomic, strong) NSString *age;
@end

#import "Person.h"
@implementation Person
//想要写出encoderWithCoder方法,必须遵守<NSCoding>协议
//调用该方法的目的是告诉他保存该对象的哪些属性。
- (void)encodeWithCoder:(NSCoder *)aCoder{
   [aCoder encodeObject:self.name forKey:@"name"];
   [aCoder encodeObject:self.age forKey:@"age"];
}
//initWithCoder告诉他读取该对象的哪些属性
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
   if (self=[super init]) {//父类没遵守NSCoding
       self.name=[aDecoder decodeObjectForKey:@"name"];
       self.dog=[aDecoder decodeObjectForKey:@"dog"];
   }
   return self;
}
@end

相关文章

网友评论

      本文标题:数据持久化存储

      本文链接:https://www.haomeiwen.com/subject/ftaibhtx.html