數(shù)據(jù)持久化的目的
- 快速展示,提升體驗
-
- 已經(jīng)加載過的數(shù)據(jù),用戶下次查看時,不需要再次從網(wǎng)絡(luò)(磁盤)加載,直接展示給用戶
- 節(jié)省用戶流量(節(jié)省服務(wù)器資源)
-
- 對于較大的資源數(shù)據(jù)進行緩存,下次展示無需下載消耗流量
-
- 同時降低了服務(wù)器的訪問次數(shù),節(jié)約服務(wù)器資源。
- 離線使用
-
- 用戶瀏覽過的數(shù)據(jù)無需聯(lián)網(wǎng),可以再次查看。
-
- 部分功能使用解除對網(wǎng)絡(luò)的依賴。(百度離線地圖、圖書閱讀器)
-
- 無網(wǎng)絡(luò)時,允許用戶進行操作,等到下次聯(lián)網(wǎng)時同步到服務(wù)端。
- 記錄用戶操作
-
- 草稿:對于用戶需要花費較大成本進行的操作,對用戶的每個步驟進行緩存,用戶中斷操作后,下次用戶操作時直接繼續(xù)上次的操作。
-
- 已讀內(nèi)容標記緩存,幫助用戶識別哪些已讀。
-
- 搜索記錄緩存
iOS中數(shù)據(jù)持久化方案
-
NSUserDefault
簡單數(shù)據(jù)快速讀寫 -
Property list
(屬性列表)文件存儲 -
Archiver
(歸檔) -
SQLite
本地數(shù)據(jù)庫 CoreData
數(shù)據(jù)持久化方式分類
在移動端的數(shù)據(jù)持有化方式總體有兩類:
內(nèi)存緩存
- 定義: 對于使用頻率比較高的數(shù)據(jù),從網(wǎng)絡(luò)或磁盤加載數(shù)據(jù)到內(nèi)存以后,使用后并不馬上銷毀,下次使用直接從內(nèi)存加載。
內(nèi)存指當前程序的運行空間,緩存速度快容量小,是臨時存儲文件用的,供CPU直接讀寫。打開一個程序,他是在內(nèi)存中存儲,關(guān)閉程序后內(nèi)存就又回到原來的空間空間。
- 案例:
-
- iOS系統(tǒng)圖片加載 —— [UIImage imageNamed:@“imageName”]
-
- 網(wǎng)絡(luò)圖片加載三方庫 SDWebImage
磁盤緩存
- 定義:將從網(wǎng)絡(luò)加載的,用戶操作產(chǎn)生的數(shù)據(jù)寫入到磁盤,用戶下次查看、繼續(xù)操作時,直接從磁盤加載使用
磁盤是程序的存儲空間,緩存容量大、速度慢、可持有化。與內(nèi)存不同的是磁盤是永久存儲東西的。
- 案例:
-
- 用戶輸入內(nèi)容草稿緩存
-
- 搜索歷史緩存
-
- 網(wǎng)絡(luò)圖片加載三方庫 SDWebImage
沙盒機制
每個iOS應(yīng)用都有自己的應(yīng)用沙盒,應(yīng)用沙盒就是文件系統(tǒng)目錄,與其他應(yīng)用的文件系統(tǒng)隔離, iOS系統(tǒng)不允許訪問其他應(yīng)用的應(yīng)用沙盒。在iOS8中已經(jīng)開放訪問(extension)。extension是iOS8新開放的一種對幾個固定系統(tǒng)區(qū)域的擴展機制,它可以在一定程度上彌補iOS的 沙盒機制對應(yīng)用間通信的限制。
應(yīng)用沙盒一般包括以下幾個文件目錄:應(yīng)用程序包、Documents、Libaray(下面有Caches和 Preferences目錄)、tmp。
-
應(yīng)用程序包
:包含所有的資源文件和可執(zhí)行文件。 -
Documents
:保存應(yīng)用運行時生成的需要持久化的數(shù)據(jù),iTunes
會自動備份該目錄。蘋果建議將程 序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下,iTunes
備份和恢復的時候會包括此目 錄 -
tmp
:保存應(yīng)用運行時所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒有運行 時,系統(tǒng)也有可能會清除該目錄下的文件,iTunes
不會同步該目錄。iphone重啟時,該目錄下的 文件會丟失。 -
Library
:存儲程序的默認設(shè)置和其他狀態(tài)信息,iTunes
會自動備份該目錄。 -
-
Libaray/Caches
:存放緩存文件,iTunes
不會備份此目錄,此目錄下文件不會在應(yīng)用退出刪除。一 般存放體積比較大,不是特別重要的資源。
-
-
-
Libaray/Preferences
:保存應(yīng)用的所有偏好設(shè)置,iOS的Settings
(設(shè)置)應(yīng)用會在該目錄中查找 應(yīng)用的設(shè)置信息,iTunes
會自動備份該目錄。
-
獲取應(yīng)用程序的沙盒路徑
// 獲取沙盒根目錄路徑
NSString *path = NSHomeDirectory();
注意: 每次編譯代碼會生成新的沙盒路徑,注意是編譯不是啟動,所以模擬機或者真機運行,每次運行所得到的沙盒路徑都是不一樣的,線上版本app真機不會生成新的沙盒路徑。
上面的代碼得到的就是當前應(yīng)用程序目錄的路徑,該目錄下就是應(yīng)用程序的沙盒,在該目錄下有4個文件夾:Documents
、Library
、SystemData
、tmp
,當前應(yīng)用程序只能訪問該目錄下的文件。
沙盒目錄的獲取方式
//獲取沙盒根路徑
NSString *path = NSHomeDirectory();
NSLog(@"沙盒根路徑:%@", path);
//Document路徑
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"Document目錄路徑:%@", docDir);
// 獲取Library的目錄路徑
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"Libarary目錄路徑:%@", libDir);
// 獲取Caches目錄路徑
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"Cacheas目錄路徑:%@", cachesDir);
// library Preference
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSLog(@"偏好設(shè)置目錄路徑:%@", defaults);
// 獲取tmp目錄路徑
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"tmp目錄路徑:%@", tmpDir);
輸出結(jié)果:
持久化數(shù)據(jù)存儲方式
XML屬性列表
屬性列表是一種XML格式的文件,拓展名為plist
。
如果對象是NSString
、NSDictionary
、NSArray
、NSData
、NSNumber
等類型,就可以使用writeToFile:atomically:
方法直接將對象寫到屬性列表文件中,舉例說明:
// 獲取 Document 文件目錄
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
// 在 Document 目錄下新建一個 test.plist 文件
NSString * filePath = [docPath stringByAppendingPathComponent:@"test.plist"];
// 存字典,將字典數(shù)據(jù)存到剛才的 test.plist 文件
NSDictionary* dict = @{ @"name" :@"zxb10", @"age" : @"20" };
[dict writeToFile:filePath atomically:YES];
// 取字典,從剛才的 test.plist 文件中取出字典數(shù)據(jù)
NSDictionary* dictA = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"%@", dictA);
// 存數(shù)組
NSArray* array = @[@"zxb10", @"20"];
[array writeToFile:filePath atomically:YES];
// 取數(shù)組
NSArray* arrayA = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@", arrayA);
輸出結(jié)果:
我們可以在document目錄下找到這個文件:
因為我們最后是存儲的 NSArray 數(shù)據(jù)類型的,所以他這里也就是 NSArray 類型的數(shù)據(jù)。
Preferences偏好設(shè)置(UserDefaults)
很多iOS應(yīng)用都支持偏好設(shè)置,提供了一套標準的解決方案來為應(yīng)用加入偏好設(shè)置功能,比如保存用戶名,字體大小,密碼,是否自動登錄等。
每個應(yīng)用都有個NSUserDefaults
實例,可以通過它來存取偏好設(shè)置,不需要路徑。其本身的創(chuàng)建類似于單例模式,我們在后面用不同的屬性名再次申請創(chuàng)建,會覆蓋之前的數(shù)據(jù)。
NSUserDefaults
:簡單數(shù)據(jù)快速讀寫,不能存儲自定義類型。UserDefaults
設(shè)置數(shù)據(jù)時,不是立即寫入,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set
方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了。出現(xiàn)以上問題,可以通過調(diào)用synchornize
方法[defaults synchornize];
強制寫入。
偏好設(shè)置存儲的優(yōu)點:
- 不需要關(guān)心文件名,系統(tǒng)會自動幫你生成一個文件名。
- 快速做鍵值對的存儲。
我們使用UserDefaults
注冊一個賬號密碼試一下:
// 獲取偏好設(shè)置對象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//存儲數(shù)據(jù)
[defaults setObject:@"zxb10" forKey:@"name"];
[defaults setObject:@"zxbnb666" forKey:@"password"];
// 同步調(diào)用,立刻寫到文件中,不寫這個方法會異步,有延遲
[defaults synchronize];
// 需要驗證賬號密碼的地方,獲取偏好設(shè)置對象
NSUserDefaults *defaultsA = [NSUserDefaults standardUserDefaults];
NSString *name = [defaultsA objectForKey:@"name"];
NSString *password = [defaultsA objectForKey:@"password"];
NSLog(@"name:%@ password:%@", name, password);
文章來源:http://www.zghlxwxcb.cn/news/detail-612940.html
數(shù)據(jù)庫存儲
-
SQLite:
是目前主流的嵌入式關(guān)系型數(shù)據(jù)庫,其最主要的特點就是輕量級、跨平臺,當前很多嵌入式操作系統(tǒng)都將其作為數(shù)據(jù)庫首選。 -
CoreData:
CoreData是iOS5之后才出現(xiàn)的一個框架,本質(zhì)上是對SQLite的一個封裝,它提供了對象-關(guān)系映射(ORM)的功能,即能夠?qū)C對象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對象,在這個過程中不需要手動編寫任何SQL語句,CoreData封裝了數(shù)據(jù)庫的操作過程,以及數(shù)據(jù)庫中數(shù)據(jù)和OC對象的轉(zhuǎn)換過程。通過CoreData管理應(yīng)用程序的數(shù)據(jù)模型,可以極大程度減少需要編寫的代碼數(shù)量。 -
FMDB:
是一個處理數(shù)據(jù)存儲的第三方框架,框架是對sqlite的封裝,整個框架非常輕量級但又不失靈活性,而且更加面向?qū)ο蟆?/li>
SQLite
和CoreData
的區(qū)別:文章來源地址http://www.zghlxwxcb.cn/news/detail-612940.html
-
CoreData
可以在一個對象更新時,其關(guān)聯(lián)的對象也會隨著更新,相當于你更新一張表時,其關(guān)聯(lián)的其他表的也會隨著更新。 -
CoreData
供更簡單的性能管理機制,可以限制查詢記錄的總數(shù),這個類會自動更新其緩存。 - 多表查詢方面,
CoreData
沒有SQL直觀,沒有類似外連接,左連接等操作。
什么是序列化和反序列化,用來做什么?
- 序列化:把對象轉(zhuǎn)化為字節(jié)序列的過程
- 反序列化:把字節(jié)序列恢復成對象
- 作用:把對象寫到文件或者數(shù)據(jù)庫中,并且讀取出來
寫入和讀取plist文件
// 其中,Show為我們plist文件的名稱,后面的plist是Show的擴展名
// 寫入plist
- (void)setDataFromPlist {
NSString *plist = [[NSBundle mainBundle] pathForResource:@"Show" ofType:@"plist"];
NSMutableDictionary *temp = [[NSMutableDictionary alloc] init];
[temp setValue:@20 forKey:@"age"];
[temp setValue:@"男" forKey:@"sex"];
[temp writeToFile:plist atomically:YES];
}
// 讀取plist
- (void)getDataFromPlist {
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Show" ofType:@"plist"];
NSMutableDictionary *dataDic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSLog(@"%@", dataDic);//直接打印數(shù)據(jù)
}
到了這里,關(guān)于【iOS】—— 持久化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!