1. 程式人生 > >iOS 使用plist和歸檔儲存資料

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];
    }