iOS數(shù)據(jù)持久化總結

1. NSUserDefaults

1.什么是NSUserDefaults衫仑,有什么用梨与?

對于應用來說,每個用戶都有自己的獨特偏好設置文狱,而好的應用會讓用戶根據(jù)喜好選擇合適的使用方式粥鞋,把這些偏好記錄在應用包的plist文件中。如果有一些設置你希望用戶即使升級后還可以繼續(xù)使用瞄崇,比如玩游戲時得過的最高分呻粹、喜好和通知設置壕曼、主題顏色甚至一個用戶頭像,那么你可以使用NSUserDefaults來存儲這些信息等浊。

NSUserDefaults同key-value方式對應存入plist文件中腮郊,那么value就要符合plist文件可以存取的格式NSData、NSString凿掂、NSDictionary、NSDate糠涛、NSArray、NSNumber,如果存入對象不是以上類型纬霞,那么必須轉變成NSData類型然后在存入

The NSUserDefaults class provides convenience methods for accessing common types such as floats, doubles, integers, Booleans, and URLs. A default object must be a property list—that is, an instance of (or for collections, a combination of instances of): NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of NSData.

以上存放方法都會有一種問題如果第一次去取key為“Login”的值孩哑,但是沒有找到這個key就有可能返回不是想要的東西横蜒;

解決方案:
[[NSUserDefaults standardUserDefaults] registerDefaults:
  [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];

給這個key給定一個默認值,因為NSUserDefaults會先在應用域中查找,如果找到了值督勺,NSUserDefaults就會返回這個值智哀。如果沒有找到送巡,NSUserDefaults就會在注冊域中查找并返回默認值次氨。

#pragma mark - User Default
// 存儲用戶偏好設置
+ (void)saveUserData:(id)data forKey:(NSString *)key {
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

// 讀取用戶偏好設置
+ (id)readUserDataForKey:(NSString *)key {
    id obj = [[NSUserDefaults standardUserDefaults] objectForKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];
    return obj;
    
}

// 刪除用戶偏好設置
+ (void)removeUserDataForkey:(NSString *)key {
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

2.NSKeyedArchiver

1.什么是NSKeyedArchiver幸撕?

provides a way to encode objects (and scalar values) into an architecture-independent format that can be stored in a file. When you archive a set of objects
提供一種編碼格式专钉,可以將OC的對象保存在文件中

2.什么是 NSKeyedUnarchiver站叼?

decodes the data in an archive and creates a set of objects equivalent to the original set.
將文件中的OC對象恢復成內存中的一個OC對象。

如果對象是NSString阔馋、NSDictionary、NSArray客蹋、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔和恢復
不是所有的對象都可以直接用這種方法進行歸檔婉烟,只有遵守了NSCoding協(xié)議的對象才可以
NSCoding協(xié)議有2個方法:

encodeWithCoder: 

每次歸檔對象時率碾,都會調用這個方法。一般在這個方法里面指定如何歸檔對象中的每個實例變量,可以使用encodeObject:forKey:方法歸檔實例變量

initWithCoder: 

每次從文件中恢復(解碼)對象時,都會調用這個方法。一般在這個方法里面指定如何解碼文件中的數(shù)據(jù)為對象的實例變量诵竭,可以使用decodeObject:forKey方法解碼實例變量

// 把對象歸檔存到沙盒里
+ (BOOL)saveObject:(id)object byFileName:(NSString *)fileName {
    NSString *path  = [self appendFilePath:fileName];
    path = [path stringByAppendingString:@".archive"];
    BOOL success = [NSKeyedArchiver archiveRootObject:object toFile:path];
    return success;   
}

// 通過文件名從沙盒中找到歸檔的對象
+ (id)getObjectByFileName:(NSString*)fileName {
    NSString *path  = [self appendFilePath:fileName];
    path = [path stringByAppendingString:@".archive"];
    id obj =  [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    return obj;
}

// 根據(jù)文件名刪除沙盒中的文件
+ (void)removeObjectByFileName:(NSString *)fileName {
    NSString *path  = [self appendFilePath:fileName];
    path = [path stringByAppendingString:@".archive"];
    [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}

+ (NSString *)appendFilename:(NSString *)fileName {
    
    // 1. 沙盒緩存路徑
    NSString *cachesPath = [NSFileManager cachesPath];
    if (![[NSFileManager defaultManager] fileExistsAtPath:cachesPath isDirectory:nil]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:cachesPath withIntermediateDirectories:NO attributes:nil error:nil];
    }
    
    return cachesPath;
}

// 拼接文件路徑
+ (NSString *)appendFilePath:(NSString *)fileName {
    
    // 1. 沙盒緩存路徑
    NSString *cachesPath = [NSFileManager cachesPath];
    
    NSString *filePath = [NSString stringWithFormat:@"%@/%@",cachesPath,fileName];
    
    if (![[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:nil]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:NO attributes:nil error:nil];
    }
    
    return filePath;
}

3. Keychain

4. SQLite

5. Core Data

6. UIPasteboard

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末氧苍,一起剝皮案震驚了整個濱河市罢荡,隨后出現(xiàn)的幾起案子惭缰,更是在濱河造成了極大的恐慌骡送,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門襟沮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來固灵,“玉大人仍秤,你說我怎么就攤上這事苇本】嫡唬” “怎么了悬荣?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵管挟,是天一觀的道長。 經常有香客問我虐秦,道長叨恨,這世上最難降的妖魔是什么送矩? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任匆背,我火速辦了婚禮铃辖,結果婚禮上五督,老公的妹妹穿的比我還像新娘基矮。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布惭等。 她就那樣靜靜地躺著料扰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拯钻,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音,去河邊找鬼达罗。 笑死辐宾,一個胖子當著我的面吹牛制肮,可吹牛的內容都是我干的豺鼻。 我是一名探鬼主播综液,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼儒飒!你這毒婦竟也來了谬莹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤桩了,失蹤者是張志新(化名)和其女友劉穎附帽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體井誉,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蕉扮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颗圣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喳钟。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡屁使,死狀恐怖,靈堂內的尸體忽然破棺而出奔则,到底是詐尸還是另有隱情蛮寂,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布应狱,位于F島的核電站共郭,受9級特大地震影響,放射性物質發(fā)生泄漏疾呻。R本人自食惡果不足惜除嘹,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岸蜗。 院中可真熱鬧尉咕,春花似錦、人聲如沸璃岳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铃慷。三九已至单芜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犁柜,已是汗流浹背洲鸠。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馋缅,地道東北人扒腕。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像萤悴,于是被迫代替她去往敵國和親瘾腰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容