iOS 使用plist和歸檔儲存資料
阿新 • • 發佈:2018-11-09
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];
}