【iOS】數(shù)據(jù)持久化

在iOS開發(fā)中我們常常需要做數(shù)據(jù)存儲(chǔ)春锋,這里主要說的時(shí)以下幾種本地?cái)?shù)據(jù)存儲(chǔ)的方式。

NSUserDefaults
屬性列表: 集合對(duì)象可以讀寫到屬性列表中
對(duì)象歸檔:對(duì)象可以保存到歸檔文件中
SQLite數(shù)據(jù)庫:開源嵌入式關(guān)系型數(shù)據(jù)庫
FMDB:

NSUserDefaults

NSUserDefaults適合存儲(chǔ)輕量級(jí)的本地?cái)?shù)據(jù)唇聘,比如用戶的信息,登錄狀態(tài)等數(shù)據(jù)。
NSUserDefaults支持的數(shù)據(jù)格式有:NSNumber(Integer慎菲、Float、Double)锨并,NSString露该,NSDate,NSArray第煮,NSDictionary解幼,BOOL類型

// 存
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"iOS開發(fā)者" forKey:@"name"];
[defaults synchronize];

// 取
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSString *name = [userDefault objectForKey:@"name"];

屬性列表

屬性列表文件是一種XML文件,F(xiàn)oundation框架中的數(shù)組和字典等都可以于屬性列表文件相互轉(zhuǎn)換包警。

  • NSArray類常用讀寫屬性列表文件的方法:
    +arrayWithContentsOfFile:類級(jí)構(gòu)造方法撵摆,用于從屬性列表文件中讀取數(shù)據(jù),創(chuàng)建NSArray對(duì)象害晦。
    -initWithContentsOfFile:實(shí)例構(gòu)造方法特铝,用于從屬性列表文件中讀取數(shù)據(jù),創(chuàng)建NSArray對(duì)象壹瘟。
    -writeToFile:atomically:該方法把NSArray對(duì)象寫入到屬性列表文件中鲫剿,第一個(gè)參數(shù)是文件名,第二個(gè)參數(shù)為是否使用輔助文件稻轨,如果為YES灵莲,則先寫入到一個(gè)輔助文件,然后輔助文件再重新命名為目標(biāo)文件殴俱,如果為NO政冻,則直接寫入到目標(biāo)文件。
 // 存儲(chǔ)路徑 
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"array.plist"];

// 寫數(shù)據(jù)
NSArray *array = @[@"test1", @"test2", @"test3"];
[array writeToFile:path atomically:YES];

// 讀數(shù)據(jù)
NSArray *getArray = [[NSArray alloc] initWithContentsOfFile:path];
NSLog(@"---讀取的數(shù)據(jù)---%@", getArray); 
  • NSDictionary類常用讀寫屬性列表文件的方法:
    +dictionaryWithContentsOfFile:類級(jí)構(gòu)造方法线欲,用于從屬性列表文件中讀取數(shù)據(jù)赠幕,創(chuàng)建NSDictionary對(duì)象。
    -initWithContentsOfFile:實(shí)例構(gòu)造方法询筏,用于從屬性列表文件中讀取數(shù)據(jù)榕堰,創(chuàng)建NSDictionary對(duì)象。
    -writeToFile:atomically:該方法將NSDictionary對(duì)象寫入到屬性列表文件中。
// 存儲(chǔ)路徑
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"dict.plist"];

// 寫數(shù)據(jù)
NSDictionary *dict = @{@"a":@"test1", @"b":@"test2", @"c":@"test3"};
[dict writeToFile:path atomically:YES];

// 讀數(shù)據(jù)
NSDictionary *getDict = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"---讀取的數(shù)據(jù)---%@", getDict);

對(duì)象歸檔

對(duì)象歸檔是一種序列化方式逆屡。存儲(chǔ)即將歸檔對(duì)象序列化位一個(gè)文件進(jìn)行持久化圾旨,讀取是通過反歸檔將持久化的數(shù)據(jù)恢復(fù)到對(duì)象中。
注意:可歸檔的對(duì)象必須實(shí)現(xiàn)NSCoding協(xié)議

  • 對(duì) Foundation 庫中對(duì)象進(jìn)行歸檔(這里不再介紹)
  • 自定義對(duì)象進(jìn)行歸檔 (需要實(shí)現(xiàn)歸檔協(xié)議魏蔗、NSCoding)

自定義類實(shí)現(xiàn)NSCoding協(xié)議

  @interface Person : NSObject <NSCoding>
  @property(nonatomic, copy) NSString *name;
  @property(nonatomic, copy) NSString *sex;
  @property(nonatomic, assign) NSInteger age;
  @end 

  @implementation Person
  - (void)encodeWithCoder:(NSCoder *)aCoder {
      [aCoder encodeObject:self.name forKey:@"name"];
      [aCoder encodeObject:self.sex forKey:@"sex"];
      [aCoder encodeInteger:self.age forKey:@"age"];
  }
  - (instancetype)initWithCoder:(NSCoder *)aDecoder {
      if (!(self = [super init])) {
          return nil;
      }
      self.name = [aDecoder decodeObjectForKey:@"name"];
      self.sex = [aDecoder decodeObjectForKey:@"sex"];
      self.age = [aDecoder decodeIntegerForKey:@"age"];
      return self;
  }
  @end

歸檔/解檔

Person *person = [[Person alloc] init];
person.name = @"iOS開發(fā)著";
person.sex = @"男";
person.age = 1000;    
NSString *file = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"person.data"];

// 歸檔
[NSKeyedArchiver archiveRootObject:person toFile:file];

// 解檔
Person *per = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
if (per) {
    NSLog(@"-------解歸檔---name----: %@", per.name);
    NSLog(@"-------解歸檔---sex----: %@", per.sex);
    NSLog(@"-------解歸檔---age----: %ld", per.age);
}

SQLite3

FMDB

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砍的,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子莺治,更是在濱河造成了極大的恐慌廓鞠,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谣旁,死亡現(xiàn)場(chǎng)離奇詭異床佳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)榄审,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門砌们,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搁进,你說我怎么就攤上這事浪感。” “怎么了饼问?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵影兽,是天一觀的道長。 經(jīng)常有香客問我莱革,道長赢笨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任驮吱,我火速辦了婚禮茧妒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘左冬。我一直安慰自己桐筏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布拇砰。 她就那樣靜靜地躺著梅忌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪除破。 梳的紋絲不亂的頭發(fā)上牧氮,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音瑰枫,去河邊找鬼踱葛。 笑死丹莲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尸诽。 我是一名探鬼主播甥材,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼性含!你這毒婦竟也來了洲赵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤商蕴,失蹤者是張志新(化名)和其女友劉穎叠萍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绪商,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苛谷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了部宿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓢湃,死狀恐怖理张,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绵患,我是刑警寧澤雾叭,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站落蝙,受9級(jí)特大地震影響织狐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筏勒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一移迫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧管行,春花似錦厨埋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至迅涮,卻和暖如春废赞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叮姑。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工唉地, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓渣蜗,卻偏偏與公主長得像屠尊,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耕拷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 在程序開發(fā)中讼昆,數(shù)據(jù)層永遠(yuǎn)是程序的核心結(jié)構(gòu)之一。我們將現(xiàn)實(shí)事物進(jìn)行抽象骚烧,使之變成一個(gè)個(gè)數(shù)據(jù)浸赫。對(duì)這些數(shù)據(jù)的加工處理是代...
    sindri的小巢閱讀 16,831評(píng)論 13 85
  • 在程序開發(fā)中,數(shù)據(jù)層永遠(yuǎn)是程序的核心結(jié)構(gòu)之一赃绊。我們將現(xiàn)實(shí)事物進(jìn)行抽象既峡,使之變成一個(gè)個(gè)數(shù)據(jù)。對(duì)這些數(shù)據(jù)的加工處理是代...
    帥不過oneS閱讀 610評(píng)論 0 1
  • 1碧查、概念 數(shù)據(jù)持久化-將數(shù)據(jù)保存在硬盤中运敢,使得機(jī)器/應(yīng)用程序重啟后,可以繼續(xù)訪問之前保存的數(shù)據(jù)忠售。 2传惠、方案 pli...
    中峰閱讀 572評(píng)論 0 1
  • 這是我個(gè)人的學(xué)習(xí)筆記 , 如有不同見解歡迎評(píng)論交流 .( 我的微博 : http://weibo.com/John...
    JohnnyB0Y閱讀 2,082評(píng)論 2 5
  • 首先我們拋出來兩個(gè)問題:1.什么是數(shù)據(jù)持久化數(shù)?2.據(jù)持久化都有哪些方法稻扬?接下來我們順著思路卦方,來解決這兩個(gè)問題。 ...
    展昭酷愛寫作閱讀 1,576評(píng)論 0 4