iOS中數(shù)據(jù)存儲方式有以下幾種:
(1)煮岁、writeToFile:atomically:
(2)疹鳄、NSUserDefaults
(3)赛蔫、NSKeyedAchiever
(4)逝嚎、使用數(shù)據(jù)庫存儲 SQLite3(該方式見后續(xù)文章)
工具/原料
* X-Code僻弹、Mac
方法/步驟
* 1、使用 writeToFile:atomically: 方法(1)該方法是一次性向文件中寫入內容并炮,本次寫入會覆蓋文件中原來的內容默刚。(2)方法解析:???????? 使用要存儲的數(shù)據(jù)對象 調用該方法,該方法有兩個參數(shù):???????? para1:要寫入的路徑(目標文件路徑)???????? para2 :BOOL型逃魄。若為no荤西,則直接寫入目標文件路徑;若為yes,則先寫到一個臨時的文件中皂冰,然后重命名后移至目標路徑中店展,這樣若在寫入過程中出現(xiàn)了系統(tǒng)崩潰等問題养篓,可以保證最終寫入目標路徑文件的完整性(一般設為yes)秃流。(3)可以存儲的數(shù)據(jù)類型為:???????? 基本數(shù)據(jù)類型、系統(tǒng)的引用(對象)類型柳弄,而自定義的對象類型不能使用該方法存儲舶胀。例:NSArray *array = @[@"你好"];??? [array writeToFile:destinationFilePath atomically:YES];
* 2、NSUserDefaults(1)描述???????? 這是一個單例類碧注,直接操作沙盒中的Library中的Preferences中的一個名為本應用的BundleID的plist文件嚣伐。(2)相關操作????? //首先獲取NSUserDefaults對象NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];1)寫數(shù)據(jù):????? 可存儲的數(shù)據(jù)類型:字符串、數(shù)組萍丐、字典轩端、data、整型逝变、浮點型基茵、BOOL型等//字符串[userDefaults setObject:@"111" forKey:@"1"];//字典NSDictionary *dic = @{@"222":@"2"};[userDefaults setObject:dic forKey:@"2"];//數(shù)組NSArray *array = @[@"333",@"3333"];[userDefaults setObject:array forKey:@"3"];????? 注意:UserDefaults設置數(shù)據(jù)時,不是立即寫入,?是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調?了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應用程序就終止了壳影。出現(xiàn)以上問題,可以通過調用synchronize方法強制寫入拱层,方法如下:[userDefaults synchronize];(2)取數(shù)據(jù)://字符串??? NSString *str = [userDefaults objectForKey:@"1"];//字典??? NSDictionary *dic = [userDefaults objectForKey:@"2"];//數(shù)組NSArray *array = [userDefaults objectForKey:@"3"];//布爾型??? BOOL isOk = [userDefaults boolForKey:@"4"];(3)修改數(shù)據(jù)//根據(jù)鍵值刪除對應的對象??? [userDefaults removeObjectForKey:@"2"];
* 3、NSKeyedAchiever???????? (1)將自定義類對象存儲到本地的過程叫對象序列化 從本地讀出自定義類對象的過程叫對象反序列化 也有人將序列化稱為歸檔宴咧。????? (2)想要存儲自定義類對象根灯,則該類要實現(xiàn)NSCoding協(xié)議以及該協(xié)議的兩個方法://編碼方法 aCoder編碼器 在編碼時 會將對象的屬性也進行編碼- (void)encodeWithCoder:(NSCoder *)aCoder{?? ?[aCoder encodeObject:_name forKey:@"name"];}//解碼方法 aDecoder解碼器 在解碼時 會將對象的屬性頁進行解碼- (id)initWithCoder:(NSCoder *)aDecoder{?? ?self.name = [aDecoder decodeObjectForKey:@"name"];}????? (3)同時,若你想自定義 打印該對象的內容掺栅,則需要重寫它的description方法烙肺,只需在重寫的方法中自定義你想打印的內容即可,這里不再贅述氧卧。????? (4)使用NSKeyedArchiver(序列化)/NSKeyedUnarchiver(反序列化)的步驟分別如下:1)序列化步驟:? A桃笙、創(chuàng)建可變數(shù)據(jù) 用于存儲序列化后的數(shù)據(jù) NSMutableData? *data? B、根據(jù)data 創(chuàng)建序列化器? C假抄、編碼? D怎栽、結束編碼? E、將data寫入沙盒? F宿饱、釋放通過 alloc 創(chuàng)建的對象?注:序列化時會調用對象實現(xiàn)的NSCoding協(xié)議中的encodeWithCoder方法 對每個對象進行編碼熏瞄。具體實例:(自定義類:People)??? NSArray *array = @[people1,people2,people3,people4,people5];??? NSMutableData *data1 = [[NSMutableData alloc] init];??? NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data1];??? [archiver encodeObject:array];??? [archiver finishEncoding];??? BOOL isOK = [data1 writeToFile:filePath atomically:YES];??? [archiver release];??? [data1 release]; ??????2)反序列化步驟:??? A、從本地取出你存儲的數(shù)據(jù)?? B谬以、若該數(shù)據(jù)不空强饮,轉至3?? C、創(chuàng)建反序列化器?? D为黎、解碼 并用 數(shù)組 接收(因為你知道存儲的是數(shù)組)?? E邮丰、結束解碼具體實例:??? NSData *data2 = [NSData dataWithContentsOfFile:filePath];??? if (data2)??? {????????? NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data2];????????? NSArray *arr2 = [unarchiver decodeObject];?????? ?? [unarchiver finishDecoding];??? }