ios數(shù)據(jù)存儲(chǔ)

數(shù)據(jù)存儲(chǔ)

iOS應(yīng)用數(shù)據(jù)存儲(chǔ)的常用方式

- XML屬性列表(plist)歸檔

- Preference(偏好設(shè)置)

- NSKeyedArchiver歸檔(NSCoding)

- SQLite3

- Core Data

應(yīng)用沙盒


應(yīng)用沙盒結(jié)構(gòu)分析

應(yīng)用程序包:(上圖中的Layer)包含了所有的資源文件和可執(zhí)行文件

Documents:保存應(yīng)用運(yùn)行時(shí)生成的需要持久化的數(shù)據(jù)万栅,iTunes同步設(shè)備時(shí)會(huì)備份該目錄辜窑。例如祥楣,游戲應(yīng)用可將游戲存檔保存在該目錄

?tmp:保存應(yīng)用運(yùn)行時(shí)所需的臨時(shí)數(shù)據(jù)宴抚,使用完畢后再將相應(yīng)的文件從該目錄刪除吱韭。應(yīng)用沒有運(yùn)行時(shí)雷厂,系統(tǒng)也可能會(huì)清除該目錄下的文件滞欠。iTunes同步設(shè)備時(shí)不會(huì)備份該目錄

Library/Caches:保存應(yīng)用運(yùn)行時(shí)生成的需要持久化的數(shù)據(jù)梨撞,iTunes同步設(shè)備時(shí)不會(huì)備份該目錄燥滑。一般存儲(chǔ)體積大渐北、不需要備份的非重要數(shù)據(jù)

Library/Preference:保存應(yīng)用的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會(huì)在該目錄中查找應(yīng)用的設(shè)置信息铭拧。iTunes同步設(shè)備時(shí)會(huì)備份該目錄

應(yīng)用沙盒目錄的常見獲取方式

沙盒根目錄:

NSString *home = NSHomeDirectory();

Documents:(2種方式)

利用沙盒根目錄拼接”Documents”字符串

NSString *home = NSHomeDirectory();

NSString *documents = [home stringByAppendingPathComponent:@"Documents"];

// 不建議采用赃蛛,因?yàn)樾掳姹镜牟僮飨到y(tǒng)可能會(huì)修改目錄名

利用NSSearchPathForDirectoriesInDomains函數(shù)

// NSUserDomainMask 代表從用戶文件夾下找

// YES 代表展開路徑中的波浪字符“~”

NSArray *array =? NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);

// 在iOS中恃锉,只有一個(gè)目錄跟傳入的參數(shù)匹配,所以這個(gè)集合里面只有一個(gè)元素

NSString *documents = [array objectAtIndex:0];

應(yīng)用沙盒目錄的常見獲取方式

tmp:NSString *tmp = NSTemporaryDirectory();

Library/Caches:(跟Documents類似的2種方法)

利用沙盒根目錄拼接”Caches”字符串

利用NSSearchPathForDirectoriesInDomains函數(shù)(將函數(shù)的第2個(gè)參數(shù)改為:NSCachesDirectory即可)

Library/Preference:通過NSUserDefaults類存取該目錄下的設(shè)置信息

屬性列表

屬性列表是一種XML格式的文件呕臂,拓展名為plist

如果對(duì)象是NSString破托、NSDictionary、NSArray歧蒋、NSData土砂、NSNumber等類型,就可以使用writeToFile:atomically:方法直接將對(duì)象寫到屬性列表文件中

屬性列表-歸檔NSDictionary

將一個(gè)NSDictionary對(duì)象歸檔到一個(gè)plist屬性列表中

// 將數(shù)據(jù)封裝成字典

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

[dict setObject:@"母雞" forKey:@"name"];

[dict setObject:@"15013141314" forKey:@"phone"];

[dict setObject:@"27" forKey:@"age"];

// 將字典持久化到Documents/stu.plist文件中

[dict writeToFile:path atomically:YES];


屬性列表-恢復(fù)NSDictionary


屬性列表-NSDictionary的存儲(chǔ)和讀取過程


偏好設(shè)置


讀取上次保存的設(shè)置

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSString *username = [defaults stringForKey:@"username"];

float textSize = [defaults floatForKey:@"text_size"];

BOOL autoLogin = [defaults boolForKey:@"auto_login"];

注意:UserDefaults設(shè)置數(shù)據(jù)時(shí)谜洽,不是立即寫入萝映,而是根據(jù)時(shí)間戳定時(shí)地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了阐虚。出現(xiàn)以上問題序臂,可以通過調(diào)用synchornize方法強(qiáng)制寫入

[defaults synchornize];

NSKeyedArchiver

如果對(duì)象是NSString、NSDictionary实束、NSArray奥秆、NSData、NSNumber等類型咸灿,可以直接用NSKeyedArchiver進(jìn)行歸檔和恢復(fù)

不是所有的對(duì)象都可以直接用這種方法進(jìn)行歸檔吭练,只有遵守了NSCoding協(xié)議的對(duì)象才可以

NSCoding協(xié)議有2個(gè)方法:

encodeWithCoder:

每次歸檔對(duì)象時(shí),都會(huì)調(diào)用這個(gè)方法析显。一般在這個(gè)方法里面指定如何歸檔對(duì)象中的每個(gè)實(shí)例變量鲫咽,可以使用encodeObject:forKey:方法歸檔實(shí)例變量

?initWithCoder:

每次從文件中恢復(fù)(解碼)對(duì)象時(shí),都會(huì)調(diào)用這個(gè)方法谷异。一般在這個(gè)方法里面指定如何解碼文件中的數(shù)據(jù)為對(duì)象的實(shí)例變量分尸,可以使用decodeObject:forKey方法解碼實(shí)例變量

NSKeyedArchiver-歸檔NSArray


NSKeyedArchiver-歸檔Person對(duì)象(Person.h)

@interface Person : NSObject@property (nonatomic, copy) NSString *name;

@property (nonatomic, assign) int age;

@property (nonatomic, assign) float height;

@end

@implementation Person

- (void)encodeWithCoder:(NSCoder *)encoder {

[encoder encodeObject:self.name forKey:@"name"];

[encoder encodeInt:self.age forKey:@"age"];

[encoder encodeFloat:self.height forKey:@"height"];

}

- (id)initWithCoder:(NSCoder *)decoder {

self.name = [decoder decodeObjectForKey:@"name"];

self.age = [decoder decodeIntForKey:@"age"];

self.height = [decoder decodeFloatForKey:@"height"];

return self;

}

- (void)dealloc {

[super dealloc];

[_name release];

}

@end

NSKeyedArchiver-歸檔Person對(duì)象(編碼和解碼)

// 歸檔(編碼)

Person *person = [[[Person alloc] init] autorelease];

person.name = @"MJ";

person.age = 27;

person.height = 1.83f;

[NSKeyedArchiver archiveRootObject:person toFile:path];

// 恢復(fù)(解碼)

Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

NSKeyedArchiver-歸檔對(duì)象的注意

?如果父類也遵守了NSCoding協(xié)議,請(qǐng)注意:

應(yīng)該在encodeWithCoder:方法中加上一句

[super encodeWithCode:encode];

確保繼承的實(shí)例變量也能被編碼歹嘹,即也能被歸檔

應(yīng)該在initWithCoder:方法中加上一句

self = [super initWithCoder:decoder];

確保繼承的實(shí)例變量也能被解碼箩绍,即也能被恢復(fù)

NSData

NSData-歸檔2個(gè)Person對(duì)象到同一文件中

歸檔(編碼)

// 新建一塊可變數(shù)據(jù)區(qū)

NSMutableData *data = [NSMutableData data];

// 將數(shù)據(jù)區(qū)連接到一個(gè)NSKeyedArchiver對(duì)象

NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];

// 開始存檔對(duì)象,存檔的數(shù)據(jù)都會(huì)存儲(chǔ)到NSMutableData中

[archiver encodeObject:person1 forKey:@"person1"];

[archiver encodeObject:person2 forKey:@"person2"];

// 存檔完畢(一定要調(diào)用這個(gè)方法)

[archiver finishEncoding];

// 將存檔的數(shù)據(jù)寫入文件

[data writeToFile:path atomically:YES];

NSData-從同一文件中恢復(fù)2個(gè)Person對(duì)象

恢復(fù)(解碼)

// 從文件中讀取數(shù)據(jù)

NSData *data = [NSData dataWithContentsOfFile:path];

// 根據(jù)數(shù)據(jù)尺上,解析成一個(gè)NSKeyedUnarchiver對(duì)象

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

Person *person1 = [unarchiver decodeObjectForKey:@"person1"];

Person *person2 = [unarchiver decodeObjectForKey:@"person2"];

// 恢復(fù)完畢

[unarchiver finishDecoding];

利用歸檔實(shí)現(xiàn)深復(fù)制


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末材蛛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子怎抛,更是在濱河造成了極大的恐慌卑吭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件马绝,死亡現(xiàn)場(chǎng)離奇詭異豆赏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門掷邦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白胀,“玉大人,你說我怎么就攤上這事抚岗』蚋埽” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵宣蔚,是天一觀的道長(zhǎng)向抢。 經(jīng)常有香客問我,道長(zhǎng)件已,這世上最難降的妖魔是什么笋额? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任元暴,我火速辦了婚禮篷扩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茉盏。我一直安慰自己鉴未,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布鸠姨。 她就那樣靜靜地躺著铜秆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讶迁。 梳的紋絲不亂的頭發(fā)上连茧,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音巍糯,去河邊找鬼啸驯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛祟峦,可吹牛的內(nèi)容都是我干的罚斗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼宅楞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼针姿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厌衙,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤距淫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后婶希,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溉愁,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拐揭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撤蟆。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖堂污,靈堂內(nèi)的尸體忽然破棺而出家肯,到底是詐尸還是另有隱情,我是刑警寧澤盟猖,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布讨衣,位于F島的核電站,受9級(jí)特大地震影響式镐,放射性物質(zhì)發(fā)生泄漏反镇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一娘汞、第九天 我趴在偏房一處隱蔽的房頂上張望歹茶。 院中可真熱鬧,春花似錦你弦、人聲如沸惊豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尸昧。三九已至,卻和暖如春旷偿,著一層夾襖步出監(jiān)牢的瞬間烹俗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工萍程, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幢妄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓尘喝,卻偏偏與公主長(zhǎng)得像磁浇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朽褪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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