iOS中常用的持久化存储方式

时间:2022-09-22 09:43:16

浅谈APP中常使用的持久化存储方式,仅供初学者学习.

 

/**

 * 写入文件

 */

-(void)saveUserName:(NSString *)username password:(NSString *)password

{

    [[NSUserDefaults standardUserDefaults] setObject:username forKey:@"username"];

    [[NSUserDefaults standardUserDefaults] setObject:password forKey:@"password"];

    [[NSUserDefaults standardUserDefaults] synchronize];

    

    //在使用的时候,就可以读出来使用

    NSString * userName = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];

    NSString * passWord = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];

    

    NSLog(@"%@ %@",userName,passWord);

    

    //NSUserDefaults 支持的数据类型有:NSNumber(NSInteger,float,double),NSString,NSDate,NSArray,NSDictionary,BOOL

    

}

 

 

-(void)savePlist

{

    //数据存储,是保存到手机里面

    //Plist存储,就是把某些数据写到plist文件中

    //Plist存储一般用来存储数组和字典

    //Plist存储是苹果特有,只有苹果才能生成Plist

    //Plist不能存储自定义对象,NSObjcet,model

    NSDictionary * dict = @{@"age":@"18",@"name":@"jack"};

    

    //保存应用沙盒(app安装到手机的文件夹)

    //Caches文件夹

    //在某个范围内容搜索文件夹的路径

    //directory:获取哪个文件夹

    //domainMask:在哪个范围下获取,NSUserDomainMask:在用户的范围内搜索

    //expandTilde 是否展开全路径,YES:展开

    

    NSString * cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

    

    NSLog(@"%@",cachePath);

    

    //拼接文件路径

    NSString * filePath = [cachePath stringByAppendingPathComponent:@"data.plist"];

    //获取应用沙盒

    NSString * homePath = NSHomeDirectory();

    NSLog(@"%@",homePath);

    

    //File:文件全路径 => 所有文件夹路径 + 文件路径

    [dict writeToFile:filePath atomically:YES];

    

    //将数据取出来

    NSLog(@"%@",[NSDictionary dictionaryWithContentsOfFile:filePath]);

    

}

 

/**

 * 归档(NSKeyedArchiver)

 */

-(void)NSKeyedArchiver

{

//    自定义对象应用范围很广,因为它对应着MVC中的Model层,即实体类。在程序中,我们会在Model层定义很多的entity,例如UserTeacherPerson等。

//    

//    那么对自定义对象的归档显得重要的多,因为很多情况下我们需要在Home键之后保存数据,在程序恢复时重新加载,那么,归档便是一个好的选择。

//    

//    下面我们自定义一个Person类:

    

    // 要使对象可以归档,必须遵守NSCoding协议

//    @interface Person : NSObject<NSCoding>

//    

//    @property (nonatomic, assign) int age;

//    @property (nonatomic, strong) NSString *name;

//    

//    @end

//    

//    @implementation Person

//    

//    // 什么时候调用:只要一个自定义对象归档的时候就会调用

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

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

//        [aCoder encodeInt:self.age forKey:@"age"];

//    }

//    

//    - (id)initWithCoder:(NSCoder *)aDecoder {

//        if (self = [super init]) {

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

//            self.age = [aDecoder decodeIntForKey:@"age"];

//        }

//        return self;

//    }

//    @end

//    如何将自定义对象归档和解档:

//    

//    - (void)savePerson {

//        // 归档:plist存储不能存储自定义对象,此时可以使用归档来完成

//        Person *person = [[Person alloc] init];

//        person.age = 18;

//        person.name = @"USER";

//        

//        // 获取tmp目录路径

//        NSString *tempPath = NSTemporaryDirectory();

//        

//        // 拼接文件名

//        NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];

//        

//        // 归档

//        [NSKeyedArchiver archiveRootObject:person toFile:filePath];

//    }

//    

//    - (void)readPerson {

//        // 获取tmp

//        NSString *tempPath = NSTemporaryDirectory();

//        

//        // 拼接文件名

//        NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];

//        

//        // 解档

//        Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

//        NSLog(@"%@ %d",p.name,p.age);

//    }

    

//    假设我们定义了一个自定义的view,这个view是用xib或者storybard来生成的,那么我们我一定如下方法时,就需要如下实现:

//    

//    @implementation CustomView

//    

//    // 解析xib,storyboard文件时会调用

//    - (id)initWithCoder:(NSCoder *)aDecoder {

//        // 什么时候调用[super initWithCoder:aDecoder]

//        // 只要父类遵守了NSCoding协议,就调用[super initWithCoder:aDecoder]

//        if (self = [super initWithCoder:aDecoder]) {

//            NSLog(@"%s",__func__);

//        }

//        

//        return  self;

//    }

//    

//    @end

 

}

 

/**

 * 如何将自定义对象归档和解档

 */

-(void)savePerson

{

  //归档:plist 存储不能存储自定义对象,此时可以使用归档来完成

    Person * person = [[Person alloc] init];

    person.age = 18;

    person.name = @"jack";

    

    //获取tmp目录路径

    NSString * tempPath = NSTemporaryDirectory();

    //拼接文件名

    NSString * filePath = [tempPath stringByAppendingPathComponent:@"person.data"];

    

    //归档

    [NSKeyedArchiver archiveRootObject:person toFile:filePath];

    

}

-(void)readPerson

{

    //获取tmp

    NSString * tempPath = NSTemporaryDirectory();

    //拼接文件名

    NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];

    //解档

    Person * p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

    NSLog(@"%@ %d",p.name,p.age);

 

 

}