本地數據存儲

一、四種本地化方式

1、XML屬性列表(plist)

2、NSUserDefaults(Preference多是偏好設置)

3、NSKeyedArchiver歸檔

4、SQLite數據庫

二、sandbox沙盒概念補充

基本概念

每個IOS應用程序都有自己的應用沙盒,可以將沙盒簡單的理解為應用的文件夾,每個應用的沙盒都是相互獨立的,其他應用不能訪問該沙盒,他也不能訪問其他應用的沙盒。

結構與用途

Documents:保存應用運行時生成的需要持久化的數據,iTunes同步設備時會備份該目錄。重要數據

Library/Caches:保存應用運行時生成的需要持久化的數據,iTunes同步設備不會備份該目錄。非重要數據

Library/Preference:保存應用的偏好設置,iTunes同步設備時會備份該目錄。

tmp:保存應用運行時所需的臨時數據,使用完畢后再將相應的文件從該目錄刪除。應用沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄。

沙盒目錄的獲取方式

1、Documents文件夾的獲取方式

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

NSString*homePath = NSHomeDirectory();

NSString*docPath = [homePath stringByAppendingString:@"/Documents"];

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

NSString*homePath = NSHomeDirectory();

NSString*docPath = [homePath stringByAppendingPathComponent:@"Documents"];

// NSDocumentDirectory 要查找的文件

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

// 在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合里面只有一個元素

NSString*path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)[0];

NSString*filePath = [path stringByAppendingPathComponent:@"xxx.plist"];

這里的參數說明一下:

第一個參數:枚舉類型,常用的有

NSDocumentDirectory(Documents文件夾)

NSCachesDirectory(Library/Caches)

第二個參數:NSUserDomainMask,表示從用戶文件夾下找。

第三個參數:打印的路徑會是這種形式~/Documents,我們一般都會用YES,這樣可以獲取完整路徑字符串。

這個方法的返回值是一個數組,但在iOS中,只有一個目錄跟傳入的參數匹配,所以這個集合里面只有一個元素,所以我們取第一個元素

2、Library/Caches文件夾的獲取方式

NSString*path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES)[0];

NSString*filePath = [path stringByAppendingPathComponent:@"student.data"];

3、tmp文件夾的獲取方式

NSString *tmp=NSTemporaryDirectory();

三、存儲方式介紹

1、四大存儲方式之一:XML屬性列表

可存儲的數據類型:NSArray、NSDictionary、NSString

文件歸檔:

NSArray*arr = [[NSArrayalloc] initWithObjects:@"1", @"2",nil];

NSString*path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)[0];

NSString*filePath = [path stringByAppendingPathComponent:@"xxx.plist"];

[arr writeToFile:filePath atomically:YES];

文件解檔:

NSString*path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES)[0];

NSString*filePath = [path stringByAppendingPathComponent:@"xxx.plist"];// 解檔

NSArray*arr = [NSArray arrayWithContentsOfFile:filePath];

2、四大存儲方式之二:NSUserDefaults

NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。

可以存儲的數據類型:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存儲其他類型,則需要轉換為前面的類型,才能用NSUserDefaults存儲。

簡單使用一:存儲字符串

如果想要將字符串永久保存到NSUserDefaults中去,只需要簡單的操作(一個Value 一個Key ),對相同的Key賦值約等于一次覆蓋,要保證每一個Key的唯一性。

//將NSString 對象存儲到 NSUserDefaults 中

NSString*passWord = @"1234567";

NSUserDefaults*user = [NSUserDefaults standardUserDefaults];

[user setObject:passWord forKey:@"userPassWord"];

//取出數據

NSUserDefaults*user = [NSUserDefaults standardUserDefaults];

NSString*passWord = [ user objectForKey:@"userPassWord"];

簡單使用二:可變數組

NSUserDefaults 存儲的對象全是不可變的,例如,如果我想要存儲一個 NSMutableArray 對象,必須先轉換成不可變數組(NSArray)再存儲,同樣,取出來的也是不可變數組,要使用可變數組需要再次轉換。

//存儲數組

NSMutableArray*mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234",nil];

NSArray* array = [NSArrayarrayWithArray:mutableArray];

NSUserDefaults*user = [NSUserDefaults standardUserDefaults];

[user setObject:array forKey:@"記住存放的一定是不可變的"];

NSUserDefaults*user = [NSUserDefaults standardUserDefaults];//轉換成可變數組

NSMutableArray*mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"記住存放的一定是不可變的"]];

簡單使用三:非上述類型則需要轉化成上述類型,例如圖片

//存數據UIImage*image=[[UIImagealloc] initWithContentsOfFile:@"photo.jpg"];

NSData *imageData = UIImageJPEGRepresentation(image,100);//UIImage對象轉換成NSData

[[NSUserDefaults standardUserDefaults] setObject:imageData forKey:@"image"];

[[NSUserDefaults standardUserDefaults] synchronize];//用synchronize方法把數據**強行**持久化到standardUserDefaults數據庫中,因為NSUserDefaults存儲數據不是及時的

//取數據NSData *imageData = [[NSUserDefaults standardUserDefaults] dataForKey:@"image"];

UIImage*Image = [UIImage imageWithData:imageData];//NSData轉換為UIImage

簡單使用四:自定義對象,將自定義類型轉換為NSData類型

當想存儲對象數組時,你可以使用用SQLite 存儲 ,也可以使用NSUserDefaults來存儲,需要注意的是雖然NSUserDefaults可以存儲不可變數組,但是數組中只限制基本數據類型,如果是對象的話,是不行的,此時我們可以將自定義對象類型通過歸檔轉化成NSData類型再進行存儲,此時,該對象模型需要遵守NSCoding協議,并且要實現實現encodeWithCoder和initWithCoder方法,前者是將對象進行編碼,后者用來解碼。

以Student類為例。

首先 .h 文件中要繼承NSCoding協議,.m文件如下:

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

? ? ? ? ? [coder encodeObject:self.nameforKey:@"name"];

? ? ? ? ? [coder encodeInteger:self.ageforKey:@"age"];

}

- (instancetype)initWithCoder:(NSCoder *)coder{

? ? ? ? ? self= [super init];

? ? ? ? ? if(self) {

? ? ? ? ? ? ? ? ? ?self.age= [coder decodeIntegerForKey:@"age"];

? ? ? ? ? ? ? ? ? ?self.name= [coder decodeObjectForKey:@"name"];

? ? ? ? ? }

? ? ? ? ? return self;

}

存儲一個學生信息

//存數據Student *student = [[Student alloc] ini];

//下面進行的是對student對象的 name , studentNumber ,sex 的賦值

student.name= @"LOLITA";

student.age= @"24";

//將student類型變為NSData類型

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];

[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"oneStudent"];

//取數據

NSdData*data= [[NSUserDefaults standardUserDefaults] objectForKey:@"oneStudent"];

Student*student = [NSKeyedUnarchiverunarchiveObjectWithData:data];

存儲多個數據時候,可以使用for循環,將所有的學生信息存儲到一個可變數組中,再可變數組轉化成不可變數組,最后使用歸檔轉化成NSData類型進行存儲

//記住要轉換成不可變數組類型

NSArray* array = [NSArray arrayWithArray:dataArray];

[[NSUserDefaults standardUserDefaults] setObject:array forKey:@"allStudent"];

NSdData*data= [[NSUserDefaults standardUserDefaults] objectForKey:@"allStudent"];

NSArray*allStudentArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];

3、四大存儲方式之三:歸檔NSKeyedArchiver

采用歸檔的形式來保存數據,該數據對象需要遵守NSCoding協議,并且該對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。前一個方法告訴系統怎么對對象進行編碼,而后一個方法則是告訴系統怎么對對象進行解碼。例如對Possession對象歸檔保存

//定義Possession:

.h

@interfacePossession:NSObject//遵守NSCoding協議

{

? ? ? ? ? NSString*name;//待歸檔類型

}

.m

@implementationPossession

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

? ? ? ? ? [aCoder encodeObject:name forKey:@"name"];

}

-(void)initWithCoder:(NSCoder *)aDecoder{

? ? ? ? ? ? name=[[aDeCoder decodeObjectforKey:@"name"] retain];

}

//歸檔

NSString*path = @"xxxxxxxxx";

[NSKeyedArchiver archiveRootObject:allPossessions toFile: path];

//解檔

allPossessions=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

缺點:歸檔的形式來保存數據,只能一次性歸檔保存以及一次性解壓。所以只能針對小量數據,而且對數據操作比較笨拙,即如果想改動數據的某一小部分,還是需要解壓整個數據或者歸檔整個數據。

4、四大存儲方式之四:SQLite

SQLite:采用SQLite數據庫來存儲數據。SQLite作為一中小型數據庫,應用ios中,跟前三種保存方式相比,相對比較復雜一些。

這里推薦使用第三方框架,FMDB,詳細使用戳這里

參考資料:

1、NSUserDefaults 簡介,使用 NSUserDefaults 存儲自定義對象

2、iOS開發中本地數據存儲的總結

3、IOS 四種保存數據的方式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容