iOS 使用plist和归档存储数据

1使用plist文件存储数据

首先要知道的是,使用plist存储数据,只能存储OC自带的数据字典和数组,无法存储自定义的数据model,例子看info.plist的样式就知道了

将数据存储到plist文件中

//获取本地沙盒路径
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    //获取完整路径
    NSString *docPath = [path objectAtIndex:0];
    // 3.新建数据
    NSMutableArray *data = [[NSMutableArray alloc] initWithObjects:@"232",@"jee", nil];
    NSString *filepath = [docPath stringByAppendingPathComponent:@"data.plist"];
    NSString *str = @"21323";
    [data insertObject:str atIndex:0];
    [data writeToFile:filepath atomically:YES];

读取并修改plist文件

    //获取本地沙盒路径  
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    //获取完整路径  
    NSString *docPath = [path objectAtIndex:0];  
    // 3.文件路径  
    NSString *filepath = [docPath stringByAppendingPathComponent:@"data.plist"];  
      
    // 4.读取数据  
    NSMutableArray *data = [NSMutableArray arrayWithContentsOfFile:filepath];  
    // 5.修改数据  
    NSString *str = @"wwwww";  
    [data insertObject:str atIndex:0];  
    [data writeToFile:filepath atomically:YES];  
    NSLog(@"%@", data);

2.使用归档存储数据

使用归档存储就可以存储自定义的model数据了

首先将让model遵循NSCoding协议

#import <Foundation/Foundation.h>
 
@interface SubData : NSObject<NSCoding>
@property (copy, nonatomic) NSString * name;
@property (copy, nonatomic) NSString * code;
@property (copy, nonatomic) NSString * imgUrl;
@property (copy, nonatomic) NSString * sub;
@property (copy, nonatomic) NSString * url;
 
@end

然后在m文件中

// 当将一个自定义对象保存到文件的时候就会调用该方法
// 在该方法中说明如何存储自定义对象的属性
// 也就说在该方法中说清楚存储自定义对象的哪些属性
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.code forKey:@"code"];
    [aCoder encodeObject:self.imgUrl forKey:@"imgUrl"];
    [aCoder encodeObject:self.sub forKey:@"sub"];
    [aCoder encodeObject:self.url forKey:@"url"];
}
 
// 当从文件中读取一个对象的时候就会调用该方法
// 在该方法中说明如何读取保存在文件中的对象
// 也就是说在该方法中说清楚怎么读取文件中的对象
- (id)initWithCoder:(NSCoder *)aDecoder
{
    //注意:在构造方法中需要先初始化父类的方法
    if (self=[super init]) {
        self.name=[aDecoder decodeObjectForKey:@"name"];
        self.code=[aDecoder decodeObjectForKey:@"code"];
        self.imgUrl=[aDecoder decodeObjectForKey:@"imgUrl"];
        self.sub=[aDecoder decodeObjectForKey:@"sub"];
        self.url=[aDecoder decodeObjectForKey:@"url"];
    }
    return self;
}

这样在model中的设置就完成了,接下来是使用时的代码

将数据存储到文件中

//获取文件路径
        NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *path=[docPath stringByAppendingPathComponent:@"recentlyUsed.archiver"];
        NSMutableArray *subDataArray = [[NSMutableArray alloc] init];
        
        [subDataArray insertObject:model atIndex:0];
        //将自定义的对象保存到文件中,调用NSKeyedArchiver的工厂方法 archiveRootObject: toFile: 方法
        [NSKeyedArchiver archiveRootObject:subDataArray toFile:path];

解档

//1.获取文件路径
    NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *path=[docPath stringByAppendingPathComponent:@"recentlyUsed.archiver"];
    
    //2.从文件中读取对象,解档对象就调用NSKeyedUnarchiver的一个工厂方法 unarchiveObjectWithFile: 即可。
    if([GYGeneralTools isFileExist:@"recentlyUsed.archiver"]) {
        self.recentlyUsedArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    }

猜你喜欢

转载自blog.csdn.net/Alexander_Wei/article/details/78560329
今日推荐