數(shù)據(jù)持久化

沙盒

iOS應(yīng)用程序只能在為該改程序創(chuàng)建的文件系統(tǒng)中讀取文件荡碾,不可以去其它地方訪問,此區(qū)域被成為沙盒盐须,所以所有的非代碼文件都要保存在此玩荠,例如圖像,圖標(biāo)贼邓,聲音阶冈,映像··,屬性列表塑径,文本文件等女坑。每個應(yīng)用程序都有自己的存儲空間,應(yīng)用程序不能翻過自己的圍墻去訪問別的存儲空間的內(nèi)容统舀,應(yīng)用程序請求的數(shù)據(jù)都要通過權(quán)限檢測匆骗,假如不符合條件的話劳景,不會被放行。
NSLog(@"沙盒文件路徑%@",NSHomeDirectory());

沙盒下有三個文件夾:
1.Documents:主要保存用戶的個人信息碉就,當(dāng)用戶重置手機配置時盟广,里邊的文件會被備份。
2.Library:里邊有兩個文件夾Caches和Preferences瓮钥,Caches里邊保存的文件不會在程序退出時清空筋量,但是重置手機配置是不會備份。Preferences里邊主要保存系統(tǒng)的單例NSUserDefaults.
3.tmp:主要保存一些程序的臨時文件碉熄。

通過主目錄得到Documents文件夾

//兩種拼接方式
NSString *documentPath = [NSHomeDirectory() stringByAppendingString:@"/Documents"];
NSString *documenPath1 = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSLog(@"%@\n%@",documentPath,documenPath1);

根據(jù)路徑找尋系統(tǒng)下相應(yīng)的文件 返回結(jié)果是一個路徑數(shù)組

//第一個參數(shù)為枚舉值桨武,枚舉值所對應(yīng)的是所要查詢的文件的路徑
//第二個參數(shù)為查詢的范圍
//第三個參數(shù)是個BOOL值,意思是詢問路徑中的~是否需要擴展
NSArray *documentsPathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"%@",[documentsPathArray firstObject]);

文件的寫入操作

文件的寫入只能寫入一些簡單的數(shù)據(jù)類型锈津,如字符串呀酸,數(shù)組,字典琼梆。不能寫入自定義的類性誉,自定義類的存儲需要用到歸檔和反歸檔。

字符串寫入:

- (void)writeDataToFiel
{
    //將字符串寫入文件
    NSString *string = @"我一會兒要進入一個文件夾";
    //創(chuàng)建數(shù)據(jù)所要寫入的文件路徑
    NSString *savePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/test.txt"];
    //寫入數(shù)據(jù)
    //file:要寫入數(shù)據(jù)的文件路徑  atomically:保證數(shù)據(jù)的原子性茎杂,如果是YES艾栋,文件在寫入過程中是一部分一部分寫入,最后拼接為完整的數(shù)據(jù)蛉顽。 encoding:如果寫入為字符串類型,這個參數(shù)為字符的編碼格式先较,一般是UTF-8
    [string writeToFile:savePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",savePath);    
}

數(shù)組的寫入:

- (void)writeArray
{
    NSArray *array = @[@"152",@"afq",@"15asd"];
    NSString *savePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/0.txt"];
    [array writeToFile:savePath atomically:YES];    
}

文件的讀取

字符串讀刃:

- (void)readDataFromFiel
{
    //要讀取文件的路徑
    NSString *readPath = [NSHomeDirectory() stringByAppendingString:@"/Documents/test.txt"];
    NSString *string = [NSString stringWithContentsOfFile:readPath encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",string);
}

數(shù)組的讀取:

- (void)readArray
{
    NSString *savePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/0.txt"];
    NSArray *array = [NSArray arrayWithContentsOfFile:savePath];
    NSLog(@"%@",array);
//    NSFileManager *fileManager = [[NSFileManager alloc] init];
//    [fileManager removeItemAtPath:savePath error:nil];.
}

文件刪除

NSFileManager:文件管理類

NSFileManager *fileManager = [[NSFileManager alloc] init];
//savePath為所要刪除的文件的路徑
[fileManager removeItemAtPath:savePath error:nil];.

歸檔和反歸檔

歸檔:實際上就是將當(dāng)前類的屬性編碼為NSData類型
反歸檔:基礎(chǔ)類型,例如NSArray都有initWithContentsOfFile的方法來初始化闲勺,但是復(fù)雜類型沒有類似方法曾棕,因為歸檔過程中我們會將當(dāng)前類轉(zhuǎn)化為NSData類型,并且存儲到了某個文件中菜循,當(dāng)我們從文件中讀取出來數(shù)據(jù)的時候翘地,只能是反歸檔來完成初始化。

創(chuàng)建一個Person類癌幕,聲明三個屬性:name衙耕,gender,age

#import "Person.h"

@implementation Person

//歸檔 
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    //實際的編碼過程勺远,原理就是將name這個屬性的值編碼為NSData類型橙喘,因為我們解碼的時候需要重新為該類屬性賦值,所以需要加標(biāo)記胶逢,也就是key
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
    [aCoder encodeInt:self.age forKey:@"age"];
    NSLog(@"執(zhí)行了歸檔方法");
}

//反歸檔
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        //將剛才編碼為NSData類型的屬性厅瞎,又通過解碼方式變回原來的類型饰潜,上面編碼過程中,所賦給key值為何種名稱和簸,底下解碼得對應(yīng)上
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.gender = [aDecoder decodeObjectForKey:@"gender"];
        self.age = [aDecoder decodeIntForKey:@"age"];       
    }
    NSLog(@"執(zhí)行了反歸檔方法");
    return self;
}
@end

使用Person將文件存入沙盒彭雾,創(chuàng)建一個視圖控制器,并且引入頭文件Person.h锁保。

#import "RootViewController.h"
#import "Person.h"

@interface RootViewController ()

@end

@implementation RootViewController

//歸檔并存入沙盒中
- (void)archiverAndSaveSandBox
{
    //歸檔實際上就是將person對象轉(zhuǎn)換為NSData類型的數(shù)據(jù)
    Person *person = [[Person alloc] init];
    person.name = @"ly";
    person.gender = @"男";
    person.age = 23;
    //歸檔的時候薯酝,實際上是將復(fù)雜類對象的屬性一一轉(zhuǎn)換為NSdata類型,所以是逐步轉(zhuǎn)換的身诺,最終需要將每一步轉(zhuǎn)換好的NSData類型組裝為一個完整的NSData蜜托,所以我們需要一個可變的NSData類型來接收它
    NSMutableData *receiveData = [[NSMutableData alloc] init];
    //歸檔操作需要借助系統(tǒng)的一個歸檔工具類來實現(xiàn),這個類實際操作就是將person對象轉(zhuǎn)換為NSData類型的數(shù)據(jù)霉赡,并賦值給初始化好的對象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:receiveData];
    //歸檔開始
    [archiver encodeObject:person forKey:@"person"];
    //需要由一個標(biāo)志橄务,讓我們直到歸檔完成了,我們receiveData中有值了
    [archiver finishEncoding];
    
    //已經(jīng)轉(zhuǎn)換完成的穴亏,就可以進行數(shù)據(jù)持久化了
    NSString *pathString = [NSHomeDirectory() stringByAppendingString:@"/Documents/person.DA"];
    [receiveData writeToFile:pathString atomically:YES];
    NSLog(@"%@",pathString);
}

//反歸檔
- (void)unArichiver
{
    //反歸檔蜂挪,實際上就是將NSData類型轉(zhuǎn)換為復(fù)雜類型對象,就是本例中的person對象
    NSString *pathString = [NSHomeDirectory() stringByAppendingString:@"/Documents/person.DA"];
    NSData *data =[[NSData alloc] initWithContentsOfFile:pathString];
    
    //反歸檔嗓化,需要借助系統(tǒng)類實現(xiàn)反歸檔過程
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    //開始反歸檔,這里要注意不是指針指向棠涮,實際上已經(jīng)初始化了
    Person *person = [unarchiver decodeObjectForKey:@"person"];
    NSLog(@"%@",person.name);
}

- (void)viewDidLoad {
    [super viewDidLoad];
     [self unArichiver];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市刺覆,隨后出現(xiàn)的幾起案子严肪,更是在濱河造成了極大的恐慌,老刑警劉巖谦屑,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驳糯,死亡現(xiàn)場離奇詭異,居然都是意外死亡氢橙,警方通過查閱死者的電腦和手機酝枢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悍手,“玉大人帘睦,你說我怎么就攤上這事√箍担” “怎么了竣付?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涝焙。 經(jīng)常有香客問我卑笨,道長,這世上最難降的妖魔是什么仑撞? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任赤兴,我火速辦了婚禮妖滔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桶良。我一直安慰自己座舍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布陨帆。 她就那樣靜靜地躺著曲秉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疲牵。 梳的紋絲不亂的頭發(fā)上承二,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音纲爸,去河邊找鬼亥鸠。 笑死,一個胖子當(dāng)著我的面吹牛识啦,可吹牛的內(nèi)容都是我干的负蚊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼颓哮,長吁一口氣:“原來是場噩夢啊……” “哼家妆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冕茅,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伤极,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姨伤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塑荒,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年姜挺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彼硫。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡炊豪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拧篮,到底是詐尸還是另有隱情词渤,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布串绩,位于F島的核電站缺虐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏礁凡。R本人自食惡果不足惜高氮,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一慧妄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剪芍,春花似錦塞淹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至状共,卻和暖如春套耕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峡继。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工冯袍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鬓椭。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓颠猴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親小染。 傳聞我的和親對象是個殘疾皇子翘瓮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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

  • 1、 沙盒概念基本介紹 iOS 應(yīng)用程序只能在該 app 的文件系統(tǒng)中讀取裤翩。這個默認的 app 文件系統(tǒng)就是我們說...
    Laughingg閱讀 2,666評論 2 10
  • 1.簡介 數(shù)據(jù)持久存儲是一種非易失性存儲资盅,在重啟動計算機或設(shè)備后也不會丟失數(shù)據(jù)。持久化技術(shù)主要用于MVC模型中的m...
    公子無禮閱讀 1,683評論 0 4
  • 一踊赠、數(shù)據(jù)持久化概述 數(shù)據(jù)持久化就是數(shù)據(jù)的永久存儲呵扛。其本質(zhì)是將數(shù)據(jù)保存為文件,存到程序的沙盒中筐带。 1今穿、數(shù)據(jù)持久化的方...
    lilinjianshu閱讀 491評論 0 1
  • 目錄 沙盒及其結(jié)構(gòu) Preference(偏好設(shè)置)-Plist 屬性列表-Plist NSKeyedArchiv...
    Ryan___閱讀 490評論 0 0
  • 一、數(shù)據(jù)持久化概述 數(shù)據(jù)持久化就是數(shù)據(jù)的永久存儲伦籍。其本質(zhì)是將數(shù)據(jù)保存為文件蓝晒,存到程序的沙盒中。 1帖鸦、數(shù)據(jù)持久化的方...
    lilinjianshu閱讀 610評論 0 1