iOS數(shù)據(jù)持久化小結(jié)(上)

首先談一下自己對iOS中數(shù)據(jù)持久化這個概念的理解鲁僚。所謂的數(shù)據(jù)持久化就是將數(shù)據(jù)保存在本地硬盤中扰魂,這樣即使我們的應(yīng)用退出后再次重啟時依然能夠拿到之前保存的數(shù)據(jù)。要談數(shù)據(jù)存儲方式首先我們需要了解一下Bundle和沙盒的含義:

Bundle:應(yīng)用程序在手機中的安裝路徑
沙盒:存儲app所有的數(shù)據(jù)的路徑

接下來我們就來實際地看看每個app的bundle和沙盒的地址蕴茴,其實也是我一直想弄清楚的東西劝评,它們其實都在個人用戶下的隱藏文件夾下,以自己創(chuàng)建的工程StepSlider這個工程為例:

Bundle地址
沙盒地址

沙盒的結(jié)構(gòu)為:

1. Documents : 保存持久化數(shù)據(jù)倦淀,會備份
2. Library : 1. Caches : 保存持久化數(shù)據(jù)蒋畜,不會備份
             2. Preferences : 保存持久化數(shù)據(jù),會備份
3. tmp : 保存臨時文件

以上每個目錄對應(yīng)的獲取方式:

{
    Documents: NSDocumentDirectory
    Library: NSLibraryDirectory
    Caches: NSCachesDirectory
}
// 1.要查找的文件夾 2.從用戶文件夾查找 3.展開目錄~ 4.得到的結(jié)果是個數(shù)組

舉例:NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
有個問題是我一直想搞清楚的撞叽,這里為什么最后要加[0]姻成?因為還函數(shù)返回的是一個NSArray,且因為每個app應(yīng)用的沙盒地址是唯一的愿棋,因此該數(shù)組僅有一個元素科展,所以可以取第一個元素[0]或者lastObject來獲取

tmp: NSString *tmp = NSTemporaryDirectory();

數(shù)據(jù)存儲的常用方式主要有以下5種:

1. plist(屬性列表)文件 -- 用到文件路徑
2. Preference(偏好設(shè)置) -- 無需文件路徑
3. NSKeyedArchiver(歸檔/解檔) -- 用到文件路徑
4. SQLite(FMDB:基于SQLite3 封裝的一套OC的API庫)
5. Core Data

第一種方式:plist

plist文件中存儲的數(shù)據(jù)都是不需要加密,數(shù)據(jù)量小糠雨,簡單的數(shù)據(jù)才睹,plist文件只能存儲NSArray和NSDictionary

- (void)setUpPlist{
    NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    NSString *filePath = [path stringByAppendingString:@"/dyf.plist"];
    NSLog(@"filePath======%@",filePath);
    
    NSDictionary *dic = @{
                          @"name":@"duyingfeng",
                          @"age":@25,
                          @"height":@1.75f,
                          @"weight":@55
                          };
    [dic writeToFile:filePath atomically:YES];
    
    
    NSDictionary *dic1 = [NSDictionary dictionaryWithContentsOfFile:filePath];
    NSLog(@"dic1=====%@",dic1);

}

我們來看一下實際運行效果:

plist文件存儲地址
日志輸出打印

總結(jié)起來plist存儲和讀取過程可以通過一張圖來看清:

plist存儲和讀取過程

第二種方式:Preference(偏好設(shè)置)

Preference(偏好設(shè)置)通常是用來存儲應(yīng)用的一些配置信息的,比如:保存用戶的用戶名甘邀,密碼琅攘,文本格式等設(shè)置,通過NSUserDefaults來存取偏好設(shè)置

- (void)setUpSaveUserDefaults {
    //獲取NSUserDefaults對象,是個單例
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    //存儲數(shù)據(jù)
    [defaults setObject:@"dyf" forKey:@"name"];
    [defaults setBool:YES forKey:@"isCool"];
    [defaults setInteger:25 forKey:@"age"];
    [defaults setDouble:1.75f forKey:@"height"];
    //強制立刻存儲
    [defaults synchronize];
}

- (void)setUpReadUserDefaults {
    //獲取NSUserDefaults對象
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    //讀取數(shù)據(jù)
    NSString *name = [defaults objectForKey:@"name"];
    BOOL isCool = [defaults boolForKey:@"isCool"];
    NSInteger age = [defaults integerForKey:@"age"];
    double height = [defaults doubleForKey:@"height"];
    
    NSLog(@"name=%@,isCool=%d,age=%ld,height=%.2f",name,isCool,(long)age,height);
}

運行完成后松邪,存儲文件位置以及日志輸出結(jié)果

使用NSUserdefaults存儲的位置
日志輸出打印
plist文件具體內(nèi)容

第三種方式:NSKeyedArchiver歸檔

只有遵守了NSCoding協(xié)議的對象才可以歸檔和解檔坞琴,所有系統(tǒng)的對象都可以直接歸檔解檔。而自定義對象必須手動遵守協(xié)議并且實現(xiàn)歸檔方法和解檔方法
encodeWithCoder 和 initWithCoder
1.對于系統(tǒng)的類:

- (void)systemEncodeAndDecode{
    NSArray *array = @[@111,@222,@333];
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *newPath = [path stringByAppendingString:@"/dyf.plist"];//這里的后綴可以任意嗎
    
    [NSKeyedArchiver archiveRootObject:array toFile:newPath];
    
    NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile:newPath];
    NSLog(@"取出數(shù)組為====%@",arr);
}
文件在沙盒中的路徑

插入圖片====

image.png

2.對于自定義的類

//歸檔
- (void)saveStudentData{
    LPDStudent *stu = [[LPDStudent alloc] init];
    stu.name = @"duyingfeng";
    stu.age = 18;
    stu.height = 1.75f;
    
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *newPath = [path stringByAppendingString:@"/stu.plist"];
    
    [NSKeyedArchiver archiveRootObject:stu toFile:newPath];

}
//解檔
- (void)readStudentData{
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *newPath = [path stringByAppendingString:@"/stu.plist"];
    LPDStudent *stu1 = [NSKeyedUnarchiver unarchiveObjectWithFile:newPath];
    NSLog(@"name-%@,age-%d,height-%.2f",stu1.name,stu1.age,stu1.height);

}
插入圖片===
image.png

3.對于多個對象
使用archiveRootObject:toFile:方法可以將一個對象直接寫入到一個文件中逗抑,但有時候可能想將多個對象寫入到同一個文件中剧辐,那么就要使用NSData來進行歸檔對象
例如:將兩個Person對象存入同一文件中

//歸檔
- (void)saveMutableStudentData{
    LPDStudent *stu1 = [[LPDStudent alloc] init];
    stu1.name = @"一號";
    stu1.age = 13;
    stu1.height = 1.55f;
    
    LPDStudent *stu2 = [[LPDStudent alloc] init];
    stu2.name = @"二號";
    stu2.age = 20;
    stu2.height = 1.90f;
    
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:stu1 forKey:@"stu1"];
    [archiver encodeObject:stu2 forKey:@"stu2"];
    [archiver finishEncoding];
    
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *newPath = [path stringByAppendingString:@"/mutable.plist"];
    [data writeToFile:newPath atomically:YES];

}
//解檔
- (void)readMutableStudentData{
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *newPath = [path stringByAppendingString:@"/mutable.plist"];

    NSData *data = [NSData dataWithContentsOfFile:newPath];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    LPDStudent *stu1 = [unarchiver decodeObjectForKey:@"stu1"];
    LPDStudent *stu2 = [unarchiver decodeObjectForKey:@"sut2"];
    [unarchiver finishDecoding];
    NSLog(@"stu1===%@,%d,%.2f",stu1.name,stu1.age,stu1.height);
    NSLog(@"stu2===%@,%d,%.2f",stu2.name,stu2.age,stu2.height);
}

插入圖片=====

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(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
  • 文/不壞的土叔 我叫張陵校赤,是天一觀的道長。 經(jīng)常有香客問我筒溃,道長马篮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任怜奖,我火速辦了婚禮浑测,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歪玲。我一直安慰自己迁央,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布滥崩。 她就那樣靜靜地躺著岖圈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钙皮。 梳的紋絲不亂的頭發(fā)上蜂科,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音株灸,去河邊找鬼崇摄。 笑死擎值,一個胖子當著我的面吹牛慌烧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸠儿,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼屹蚊,長吁一口氣:“原來是場噩夢啊……” “哼厕氨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汹粤,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤命斧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嘱兼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體国葬,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年芹壕,在試婚紗的時候發(fā)現(xiàn)自己被綠了汇四。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡踢涌,死狀恐怖通孽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情睁壁,我是刑警寧澤背苦,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站潘明,受9級特大地震影響行剂,放射性物質(zhì)發(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

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