三種數據存儲方式: plist存儲,偏好設置,歸檔

當一些數據需要保存到手機上方便下次複用,就需要用到系統這三種的存儲方法,各有自己的長處,下面讓我們瞭解各種方法

----plist存儲

//數據一部都是存取字典和數組,這時我們就可以使用plist文件存儲,然後把它放到沙盒當中,
//當然plist在平臺是沒有的,只有iOS當中纔有,他是iOS特有的存儲方法

-(void)save{
//第一步:獲取沙盒
//這裏我們需要用到一個文件搜索方法
//在某個範圍內搜索文件夾的路徑.
//參數一: directory:獲取哪個文件夾
 //參數二:domainMask:在哪個路徑下搜索
//參數三:expandTilde:是否展開路徑.
NSArray*array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
//指定搜索的是Cache目錄,所以結果只有一個,取出第一個就是沙盒路徑
   NSString*cachePath = array[0];
//拼接文件路徑
   NSString*filePathName = [cachePathstringByAppendingPathComponent:@"agePlist.plist"];
//剩下的就是怎麼生成一個plist文件,然後放到沙盒裏
//其實字典中,已經提供了一種生成plist方法,數組同理
//先生成一個字典
NSDictionary*dict =@{@"age":@18,@"name":@"gaowei"};
//然後直接寫入的沙盒路徑中[自動轉換爲plist文件]
[dictwriteToFile:filePathNameatomically:YES];
}

//讀取數據

-(void)read{

//繼續使用文件搜索的方法,搜索沙盒地址[因爲結果可能多個,所以是一個數組]

NSArray *array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)

//Cache目錄裏只有一個文件,只需取第一個

   NSString*cachePath = array[0];

//拼接地址 [地址爲:沙盒路徑/保存的plist名稱.plist]

   NSString*filePathName = [cachePath stringByAppendingPathComponent:@"agePlist.plist"];

//讀取plist文件的


}


================== 我是一個華麗分割線 ==================

---- 歸檔

//保存數據

-(void)save{

//歸檔一般都是保存自定義對象的時候,使用歸檔是因爲plist文件不能夠保存自定義對象

//如果你想把自定義對象保存在字典中,然後保存到plist也是不會成功生成plist文件

Persion *persion = [[Persion allco] init];

persion.name = @"張三"

persion.age = 18


//獲得沙盒臨時目錄[只有程序被刪除,才一同刪除,不然一直存在]

NSString*tempPath =NSTemporaryDirectory();

    NSString *filePath = [tempPath stringByAppendingPathComponent:@"persion.data"];
   //archiveRootObject這個方法會自動調用保存對象的encodeWithCoder代理方法[需要在對象中遵守NSCoding方法,並調用該方法],去詢問要保存該對象的哪些屬性
[NSKeyedArchiver archiveRootObject:persiion toFile:filePath];

}


//讀取數據

- (Void)reader {

//獲取沙盒臨時目錄[只有程序被刪除,才一同刪除,不然一直存在]

NSString *tempPath = NSTemporaryDirectouy();

NSString *filePath = [tempPath stringByAppendingPathComponent:@"persion.data"]'

//NSKeyedUnarchiver會調用initWithCoder方法,來讓你告訴他去獲取這個對象的哪些屬性,所以我們在保存的對象當中實現initWithCoder代理方法.

persion *persion = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

}


//歸檔最重要的步驟

->Persion.h

#import<Foundation/Foundation.h>
要遵守<NSCoding>協議
@interfacePersion : NSObject<NSCoding>

@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)int age;

@end

->Persion.m

archiveRootObject這個方法底層會去調用保存對象的encodeWithCoder方法,去詢問要保存這個對象的哪些屬性.
只有遵守了NSCoding協議之後才能夠實現這個方法.
-(void)encodeWithCoder:(NSCoder*)encode{

    [encode
encodeObject:self.nameforKey:@"name"];
    [encode
encodeInt32:self.ageforKey:@"age"];
}


NSKeyedUnarchiver會調用initWithCoder這個方法,來讓你告訴它去獲取這個對象的哪些屬性.
initWithCoder什麼時候調用:解析一個文件的時候就會調用   [如:persion.data].
-(instancetype)initWithCoder:(NSCoder*)decoder{   
    if (self= [superinit]) {
       要給它裏面的屬性進行賦值,外界取得對象時訪問該屬性,裏面纔會用值.
      self.age= [decoder decodeInt32ForKey:@"age"];
       self.name= [decoder decodeObjectForKey:@"name"];
    }
   
return self;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章