1. 程式人生 > >資料持久化其實很簡單 【上】(精華)

資料持久化其實很簡單 【上】(精華)

        在iOS開發中,資料持久化非常重要,但是新手也很迷茫,該怎麼對資料進行處理呀,哪種方式好,每種方式又有什麼弊端? 到底該怎麼進行選擇呢,接下來我想給大家分享分享,相互學習。

首先現在常用的資料持久化有4種

        XML屬性列表(plist),Preference(偏好設定)  ,NSkeyedArchiver(物件歸檔), SQlite  ,CoreData

      XML屬性列表(plist)

      適用物件:僅僅是Foundation框架中自帶的一些類(NSSting,NSArray,NSData,NSNumber等等)

      方法: 

    //1.設定路徑,一般存在Document
    NSString * plistfileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"save.plist"];
    
    //2.設定儲存內容,我以陣列為例子
    NSArray *
[email protected]
[@"存的內容",@"存的內容" ]; //3.存入plistfileName裡面 [writecontent writeToFile:plistfileName atomically:YES]; //完成 //如果以後要取出來,讀取plistfileName裡面 NSArray *readcontent = [NSArray arrayWithContentsOfFile:plistfileName]; NSLog(@"%@",read content);
  

    優缺點

                     plist常用於儲存長時間不容易發生變化的資料,比如省市名、車輛名稱等,不同類別的內容可以用不同的plist來管理。

                     缺點是每次都要全部載入入記憶體,所以不適合存大資料,而且只能存NSDate、NSNumber,NSArray等型別資料。


    Preference(偏好設定)

      適用物件:本質還是Plist屬性列表儲存方式(偏好設定類資料,比如使用者密碼,字型大小等)

      方法:

    //1.初始化userDefaults(相當於幫你自動設定好了路徑以及plist名稱)
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
    //2.存入內容
    [userDefaults setObject:@"張三" forKey:@"name"];
    [userDefaults setObject:@"1234" forKey:@"password"];
    
    //3.立即儲存(如果不寫的話,它會將來某個不確定時間存入)
    [userDefaults synchronize];
    
    //完成
    
    //如果以後要取出來, 讀取userDefaults檔案
    NSString *name =    [userDefaults objectForKey:@"name"];
    NSString *password= [userDefaults objectForKey:@"password"];
    NSLog(@"%@",name);
    NSLog(@"%@",password);

開啟com.base.data.plist


優缺點

                     不用提前匯入儲存路徑,預設就存於Library裡的Preference裡com.base.data.plist,通過鍵值對進行存取

                     缺點是隻有一個com.base.data.plist檔案來存取資料,不能分類管理,plist快取越來越大,要讀取的時候需要載入整個plist記憶體也吃不消,建議只存偏好設定類的小資料

     NSkeyedArchiver(物件歸檔)

      適用物件:能將任何遵守了NScoding協議的物件塞進檔案中

      方法: 

第一步設定協議:

#import <Foundation/Foundation.h>

@interface Student : NSObject<NSCoding>


//2.設定屬性

@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) NSInteger age;


@end
第二步設定對應的歸檔(哪些屬性要存取,怎麼儲存)和解檔(哪些屬性要讀取,怎麼讀取)
#import "Student.h"

@implementation Student

//歸檔
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}


//解檔
- (id)initWithCoder:(NSCoder *)aDecoder {
    if ([super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
    }
    
    return self;
}


@end

第三步實現
    //存入student類的資料
    NSString *fileName = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"stu.data"];
    
    Student *stuWrite = [[Student alloc] init];
    stuWrite.name = @"張三";
    stuWrite.age = 23;
    
    [NSKeyedArchiver archiveRootObject:stuWrite toFile:fileName];

    

    //如果以後要取出來, 讀取fileName目錄下的stu.data
    Student *stuRead = [NSKeyedUnarchiver unarchiveObjectWithFile:fileName];
    if (stuRead) {
        NSString *name  = stuRead.name;
        NSInteger age= stuRead.age;
        NSLog(@"%@",name);
        NSLog(@"%ld",(long)age);
方法

優缺點

                     可以儲存任何遵守了協議的物件,儲存後為加密的data資料。

                     缺點過程比較麻煩,要設定協議,要在model裡面設定歸檔,解檔。如果父類也遵守了該協議,要先呼叫父類的歸檔和解檔。


相關推薦

資料持久化其實簡單 精華

        在iOS開發中,資料持久化非常重要,但是新手也很迷茫,該怎麼對資料進行處理呀,哪種方式好,每種方式又有什麼弊端? 到底該怎麼進行選擇呢,接下來我想給大家分享分享,相互學習。 首先現在常用的資料持久化有4種:         XML屬性列表(plist),Pr

指令碼其實簡單-愛心列印指令碼1

教程簡介 本系列教程(指令碼其實很簡單)的目的是熟悉Windows下的bat指令碼和Linux下的bash shell指令碼。 指令碼的特性就在於不依賴於特定環境,直接呼叫作業系統,不需要“中間人”就可以執行。 文章簡介 作為系列的第一篇文章,思來想去,最終兼顧程式設計師和屌絲單身貴族的身份,打算完成

Android 網路資料解析實現一個簡單的新聞例項

      一般安卓在學到非同步任務AsyncTask之後都會有個安卓小專案的任務。得到(荔枝新聞,茶百科等)新聞網路介面來解析網路圖片或文字到ListView元件上顯示。其中要使用到的知識大概有:獲取網路資料(HttpUtil),解析網路資料(NewsParse),防止因

面向物件程式設計其實簡單——Python 面向物件初級篇

概述 面向過程:根據業務邏輯從上到下寫壘程式碼 函式式:將某功能程式碼封裝到函式中,日後便無需重複編寫,僅呼叫函式即可 面向物件:對函式進行分類和封裝,讓開發“更快更好更強...” 面向過程程式設計最易被初學者接受,其往往用一長段程式碼來實現指定功能,開發過

[轉]Web APi之認證Authentication兩種實現方式十三

用戶數 ted das 客戶 元素 基礎 目標 開始 net 本文轉自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如

Java_SSMEclipse中通過maven引入jar包

osc ati eight wid -- stat ack ips 技術 這篇博文我們介紹一下如何通過eclipse配置setting並引入jar包 (1)eclipse:Window--Preferences--Maven--User Setting 全部完成

Web APi之認證Authentication兩種實現方式十三

基於web 推薦 zed {0} scheme sage https 函數 ges 原文:Web APi之認證(Authentication)兩種實現方式【二】(十三)前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如何合理的利用

Headmaster's Headache UVa10817DP

employ ace class CA ted same ring form rain 題目: The headmaster of Spring Field School is considering employing some new teachers for cert

PyQt502添加組件:圖標、按鈕

5.1 connect pyqt 任務 模塊 內置 圖標 utf block 環境說明: 平臺:WIN10(教育版) 環境:Anaconda5.2(Python3.6.6) IDE:Pacharm2018.2.1(專業版) PyQt5:5.11.2 任務目標一:添加圖標

PyQt502改變窗體的位置和大小

blank font .com python core www. geo target elf 特別說明 為了直接展示本篇的重點,往期內容將不再寫入代碼中,讀者可按需自行編碼組合 為了更好的展示效果,代碼段將以圖片的形式上傳,若想復制代碼可移步筆者的Github 為了便於

PyQt506添加組件:按鈕,並設置位置和大小

github 輸出 技術 代碼 qt5 上傳 評論 教育版 www 特別說明 為了直接展示本篇的重點,往期內容將不再寫入代碼中,讀者可按需自行編碼組合 為了更好的展示效果,代碼段將以圖片的形式上傳,若想復制代碼可移步筆者的Github 為了便於學習,每篇只解決一個小問題,

TensorFlow01線性回歸

lob 超參數 教育版 ini src ont numpy mat font 特別說明 代碼地址:Github 環境說明 平臺:WIN10(教育版) 環境:Anaconda5.2(Python3.6.6) IDE:Pacharm2018.2.3(專業版) Tensor

Django2Django模塊創建應用程序

網站 sca tar 註意 運行 ESS etime tex efi 保持runserver還在運行,在manage.py相同的目錄下,新開一個終端窗口,激活虛擬環境,執行startapp命令 python manage.py startapp learn

Django3創建網頁:學習筆記主頁

nbsp 圖片 png 剛才 需要 ews namespace render esp 創建Django的過程通常為三個階段:定義URL,編寫視圖和編寫模板。 映射URL 當在瀏覽器中輸入URL時,現在默認會返回默認的Django網站,現在需要將主頁映射到項目&ldquo

Django1Django模組建立專案

  1.建立虛擬環境 python -m venv ll_env 建立一個名為ll_env的虛擬環境     如果Python是較早的版本,或者系統沒有正確的設定,將不能正確的使用模組venv,可以安裝virtualenv包   可執行pip install --user v

Django4建立其他頁面

建立完了網站的主頁後,我們將建立兩個顯示資料的網頁,一個列出所有的主題,另一個顯示特定主題的所有條目。對於每個網頁,都要指定其URL模式,編寫一個檢視函式,一個模板。這樣做之前,可以先編寫一個父模板,讓專案中的其他模板都繼承它。 1.模板繼承   1-1.父模板   先建立一個base.htm

Django4創建其他頁面

logs The keep 分享 objects 鏈接 code 程序 ont 創建完了網站的主頁後,我們將創建兩個顯示數據的網頁,一個列出所有的主題,另一個顯示特定主題的所有條目。對於每個網頁,都要指定其URL模式,編寫一個視圖函數,一個模板。這樣做之前,可以先編寫一個父

ElasticSearch“Result window is too large & 深度分頁”的利弊權衡

    如題,在使用elastic search的dsl查詢過程中,遇到了如下問題: { "error": { "root_cause": [{ "type": "query_phase_execution_exception", "reason": "Re

ElasticSearch目前我對ES的應用場景

【前提】        目前公司訂單資料庫雖然使用了索引、快取、讀寫分離等,由於業務本身複雜以及資料量的不斷上漲,導致查詢出現了瓶頸,海量資料查詢對於APP有時候甚至出現超時現象,不得不對這種情況做出處理。其中可行解決方案比如:分庫分表、使用Elastic

ElasticSearch初識ES

       接觸ElasticSearch一段時間了,前期調研、專案接入、資料同步、列表查詢這些階段都已經經歷了,但是ES在腦海中的整體映像還是模模糊糊,做個梳理,認真地思考一下ElasticSearch中模糊的思維。     &nb