iOS 數(shù)據(jù)存儲的幾種方式

iOS開發(fā)中本地存儲主要有四種形式

  • 屬性列表(plist 文件)
  • 偏好設置 (NSUserDefault)
  • NSKeyedArchiver歸檔(NSCoding)
  • 數(shù)據(jù)庫

在這之前先簡單介紹一下 應用沙盒

要想在本地存儲數(shù)據(jù),那就要知道一下什么是應用沙盒 ,其實很好理解應用沙盒就是應用的文件夾氓润,與其他文件系統(tǒng)隔離华坦。每一個iOS應用都有自己的應用沙盒蜡吧,應用必須待在自己的沙盒里钟些,其它應用不能訪問該沙盒桦卒。
現(xiàn)在我們來看看應用沙盒里面這些文件夾都是做什么用的

  • Documents** :保存應用運行時生成的需要持久化的數(shù)據(jù)诗箍,iTunes同步設備時會備份該目錄鳖敷。例如脖苏,游戲應用可將游戲存檔保存在該目錄
  • Library/Caches** : 保存應用運行時生成的需要持久化的數(shù)據(jù),iTunes同步設備時不會備份該目錄定踱。一般存儲體積大棍潘、不需要備份的非重要數(shù)據(jù)
  • Library/Preference** : 保存應用的所有偏好設置,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息崖媚。iTunes同步設備時會備份該目錄
  • tmp** : 保存應用運行時所需的臨時數(shù)據(jù)亦歉,使用完畢后再將相應的文件從該目錄刪除。應用沒有運行時畅哑,系統(tǒng)也可能會清除該目錄下的文件肴楷。iTunes同步設備時不會備份該目錄

應用沙盒目錄的常見獲取方式

Documents文件夾的獲取方式(3種)

  • 1.第一種(不推薦)
// 利用沙盒根目錄拼接字符串
NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingString:@"/Documents"];
  • 第二種 (也不推薦)
// 利用沙盒根目錄拼接”Documents”字符串
NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];
  • 3.第三種 (推薦)
// NSDocumentDirectory 要查找的文件
// NSUserDomainMask 代表從用戶文件夾下找
// 在iOS中,只有一個目錄跟傳入的參數(shù)匹配荠呐,所以這個集合里面只有一個元素
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"xxx.plist"];
最后一個參數(shù)如果是NO的話赛蔫,打印的路徑會是這種形式~/Documents,我們一般都會用YES泥张,這樣可以獲取完整路徑字符串呵恢!

Library/Caches文件夾的獲取方式(跟上面的方法相似)

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"student.data"];

tmp文件夾的獲取方式

NSString *tmp= NSTemporaryDirectory();

XML屬性列表(plist)歸檔

plist文件
plist的根Type只能是字典(NSDictionary)或者是數(shù)組(NSArray)所以歸檔時我們只能將數(shù)組或字典保存到plist文件中,但是NSString也能通過歸檔保存到plist文件中同時它也可以通過stringWithContentsOfFile解檔圾结,它保存到plist中時Type是空的瑰剃,Value是有值的!

plist文件的歸檔

NSArray *arr = [[NSArray alloc] initWithObjects:@"1", @"2", nil];
// NSDocumentDirectory 要查找的文件
// NSUserDomainMask 代表從用戶文件夾下找
// 在iOS中筝野,只有一個目錄跟傳入的參數(shù)匹配晌姚,所以這個集合里面只有一個元素
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"xxx.plist"];
[arr writeToFile:filePath atomically:YES];

plist文件的解檔

NSString *filePath = [path stringByAppendingPathComponent:@"xxx.plist"];
// 解檔
NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@", arr);

Preference(偏好設置)

OC中有一個NSUserDefaults的單例,它可以用來存儲用戶的偏好設置歇竟,例如:用戶名挥唠,字體的大小,用戶的一些設置等焕议,下面我用兩個UISwitch來演示如何保存用戶設置開關的關閉狀態(tài)

保存用戶偏好設置

// 獲取用戶偏好設置對象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 保存用戶偏好設置
[defaults setBool:self.one.isOn forKey:@"one"];
[defaults setBool:self.two.isOn forKey:@"two"];
// 注意:UserDefaults設置數(shù)據(jù)時宝磨,不是立即寫入,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應用程序就終止了唤锉。
// 出現(xiàn)以上問題世囊,可以通過調(diào)用synchornize方法強制寫入
// 現(xiàn)在這個版本不用寫也會馬上寫入 不過之前的版本不會
[defaults synchronize];

讀取用戶偏好設置

// 讀取用戶偏好設置
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
self.one.on = [defaults boolForKey:@"one"];
self.two.on = [defaults boolForKey:@"two"];

NSKeyedArchiver歸檔(NSCoding)

只有遵守了NSCoding協(xié)議的類才可以用NSKeyedArchiver歸檔和NSKeyedUnarchiver解檔,如果對象是NSString窿祥、NSDictionary株憾、NSArray、NSData晒衩、NSNumber等類型嗤瞎,可以直接用NSKeyedArchiver歸檔和NSKeyedUnarchiver解檔~

實現(xiàn)encodeWithCoder和initWithCoder方法

- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:self.name forKey:@"name"];
[coder encodeInteger:self.age forKey:@"age"];
}

- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
    self.age = [coder decodeIntegerForKey:@"age"];
    self.name = [coder decodeObjectForKey:@"name"];
}
return self;
}

歸檔

Student *s1 = [[Student alloc] init];
s1.name = @"zzz";
s1.age = 18;

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// 這個文件后綴可以是任意的,只要不與常用文件的后綴重復即可听系,我喜歡用data
NSString *filePath = [path stringByAppendingPathComponent:@"student.data"];
// 歸檔
[NSKeyedArchiver archiveRootObject:s1 toFile:filePath];

解檔

NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingPathComponent:@"student.data"];
// 解檔
Student *s = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@----%ld", s.name, s.age);

以上就是OC的幾種存儲方式,做個筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贝奇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子靠胜,更是在濱河造成了極大的恐慌掉瞳,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓帽,死亡現(xiàn)場離奇詭異菠赚,居然都是意外死亡,警方通過查閱死者的電腦和手機郑藏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門衡查,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人必盖,你說我怎么就攤上這事拌牲。” “怎么了歌粥?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵塌忽,是天一觀的道長。 經(jīng)常有香客問我失驶,道長土居,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任嬉探,我火速辦了婚禮擦耀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涩堤。我一直安慰自己眷蜓,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布胎围。 她就那樣靜靜地躺著吁系,像睡著了一般德召。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汽纤,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天上岗,我揣著相機與錄音,去河邊找鬼冒版。 笑死液茎,一個胖子當著我的面吹牛逞姿,可吹牛的內(nèi)容都是我干的辞嗡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼滞造,長吁一口氣:“原來是場噩夢啊……” “哼续室!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谒养,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤挺狰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后买窟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丰泊,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年始绍,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞳购。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡亏推,死狀恐怖学赛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吞杭,我是刑警寧澤盏浇,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站芽狗,受9級特大地震影響绢掰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜童擎,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一滴劲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柔昼,春花似錦哑芹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碴萧。三九已至,卻和暖如春末购,著一層夾襖步出監(jiān)牢的瞬間破喻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工盟榴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曹质,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓擎场,卻偏偏與公主長得像羽德,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迅办,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容