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

進(jìn)入正題之前,先要了解iOS的>沙盒(sandbox)<

  • 它的特點(diǎn)如下:
    1.每個(gè)程序都在自己的沙盒內(nèi)
    2.不能隨意跨越沙盒去訪問別的程序沙盒內(nèi)容
    3.應(yīng)用程序向外請(qǐng)求或者獲取數(shù)據(jù)都要經(jīng)過權(quán)限認(rèn)證
    4.所有非代碼文件都保存在沙盒內(nèi),比如圖片,聲音,屬性文件等.
    不難看出,沙盒機(jī)制讓iOS相對(duì)其他系統(tǒng)更加安全,讓程序之間的通訊受到管理.

  • 沙盒中的目錄結(jié)構(gòu):

iOS沙盒目錄.png

1.Documents
存放內(nèi)容:程序運(yùn)行時(shí)生成的一些需要長(zhǎng)久保存的,不可再生的數(shù)據(jù)(游戲進(jìn)度,應(yīng)用程序個(gè)人設(shè)置等)
是否會(huì)被iTunes同步:會(huì)

2.Library
2.1.Library/Caches
存放內(nèi)容:用戶使用過程中的緩存文件,可再生(網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)),App需要有對(duì)應(yīng)的刪除Caches的功能.
是否會(huì)被iTunes同步:不會(huì)

2.2Library/Preference:應(yīng)用程序的偏好文件,使用>NSUserDefaults<保存的設(shè)置數(shù)據(jù)都會(huì)保存在這個(gè)文件夾下.
是否會(huì)被iTunes同步:會(huì)

3.tmp
存放內(nèi)容:各種臨時(shí)文件,App再次運(yùn)行時(shí)主動(dòng)刪除,系統(tǒng)也會(huì)在磁盤空間不足時(shí)主動(dòng)清理.
是否會(huì)被iTunes同步:不會(huì)

獲取沙盒相關(guān)目錄路徑

獲取沙盒目錄

NSHomeDirectory()

獲取tmp目錄

NSTemporaryDirectory()

獲取Documents和Library目錄

NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)

這個(gè)方法用戶返回指定范圍內(nèi)的指定目錄的路徑,包括三個(gè)參數(shù):
1.directory:要搜索的目錄名稱,比如使用NSDocumentDirectory表明想要查找Documents目錄;使用NSCachesDirectory表明想要查找Library/Caches目錄

2.domainMask:指定搜索范圍,比如使用NSUserDomainMask表明想要在當(dāng)前應(yīng)用沙盒目錄下查找;NSLocalDomainMask表明想要查找/Library等.

3.expandTilde:返回一個(gè)BOOL值,表示是否展開"~"符號(hào),返回全路徑

//返回YES
"/Users/mac/Library/Developer/CoreSimulator/Devices/466710BC-3138-45F4-ADCD-FC14379107AC/data/Containers/Data/Application/EB044A4C-1454-4A12-BBB1-EF14E06C681F/Documents"
//返回NO
"~/Documents"

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

plist

拼接文件路徑和名稱

[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"fileName.plist"];
  • 存儲(chǔ)數(shù)據(jù):
[dataArray writeToFile:filePath atomically:YES];

第一個(gè)參數(shù): 文件全路徑
第二個(gè)參數(shù): YES, 在寫入文件的時(shí)候, 會(huì)先寫入一個(gè)臨時(shí)文件, 當(dāng)所有數(shù)據(jù)完成寫入過之后, 會(huì)把這個(gè)文件名修改為要保存的文件名, 如果寫入失敗, 則不修改.

  • 讀取數(shù)據(jù):
[NSArray arrayWithContentsOfFile:filePath]

可以調(diào)用writeToFile的類:

可以調(diào)用WriteToFile的類.png

NSUserDefaults

  • 很多iOS應(yīng)用都支持偏好設(shè)置,比如保存用戶名/密碼/字體大小等設(shè)置,iOS提供了一套標(biāo)準(zhǔn)的解決方案來為應(yīng)用加入偏好設(shè)置功能,

  • 每個(gè)應(yīng)用都有個(gè)NSUserDefaults實(shí)例,它是一個(gè)單例對(duì)象,通過它來存取偏好設(shè)置,設(shè)置信息都是鍵值對(duì)的形式,

  • UserDefaults主要用來存儲(chǔ)用戶系統(tǒng)的設(shè)備信息,但有的時(shí)候也可以在程序的任何地方用來存儲(chǔ)>輕量級(jí)<數(shù)據(jù),作為全局?jǐn)?shù)據(jù)來訪問.

  • 不用程序猿管理存儲(chǔ)的目錄和路徑

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

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"Key"];

  • 讀取數(shù)據(jù):
 [[NSUserDefaults standardUserDefaults] boolForKey:@"Key"];

UserDefaults支持的數(shù)據(jù)類型:

UserDefaults支持的數(shù)據(jù)類型.png

歸檔&解檔

要了解歸檔/解檔,需要先了解NSCoding協(xié)議,蘋果官方給出的描述如下:

  • The NSCoding protocol declares the two methods that a class must implement so that instances of that class can be encoded and decoded. This capability provides the basis for archiving (where objects and other structures are stored on disk) and distribution (where objects are copied to different address spaces).
  • NSCoding協(xié)議聲明了兩個(gè)方法,一個(gè)類想要實(shí)現(xiàn)歸檔/解檔必須要遵守NSCoding協(xié)議.一旦遵守,就可以歸檔(對(duì)象存儲(chǔ)在磁盤上)和解檔(對(duì)象可以復(fù)制到不同的位置)

需要注意的是:所有原生的類都已經(jīng)遵守了<NSSecureCoding>協(xié)議,所以可以直接歸檔/解檔

  • 存儲(chǔ)數(shù)據(jù):
[NSKeyedArchiver archiveRootObject:object toFile:filePath];
  • 讀取數(shù)據(jù):
[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

如果是自定義類:Person

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

想要?dú)w檔/解檔,除了要遵守NSCoding協(xié)議,還要在>類內(nèi)部<實(shí)現(xiàn)兩個(gè)方法:

  • 歸檔器:
 -(void)encodeWithCoder:(NSCoder *)aCoder {

    [aCoder encodeObject:self.name forKey:@"name"];
    
    [aCoder encodeInteger:self.age forKey:@"age"]; 
}
  • 解檔器
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    [aDecoder decodeObjectForKey:@"name"];
    
    [aDecoder decodeObjectForKey:@"age"];
    
    return self;
}

數(shù)據(jù)庫

  • 有別于系統(tǒng)提供的數(shù)據(jù)存儲(chǔ)方式,可以進(jìn)行大批量數(shù)據(jù)的增/刪/改/查.
  • 數(shù)據(jù)庫結(jié)構(gòu)類似Excel表格
  • iOS系統(tǒng)使用的是輕量級(jí)的SQLite數(shù)據(jù)庫

篇幅較大,以后專門開一篇博來分享.

最后:謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容