天天看點

關于plist檔案的那些事

 今天遇到新生問一個問題,就是用自己定義了一個plist檔案,然後可以往裡面寫東西,但是寫過再次運作的時候裡面的資料總是最後一次寫入的資料。後來就專門研究了一下plist檔案。

    大家都知道當你建立一個項目的時候,在supporting files中會有一個info.plist檔案,這個檔案中存儲的資訊如下:

關于plist檔案的那些事

 它是整個app的配置檔案,包括了版本資訊以及app桌面顯示名稱等資訊。可能是我還不太了解,但是經過我測試發現我無法用代碼對info.plist這個檔案進行操作。

    先把plist檔案放在一邊,先了解一下檔案目錄,這個我認為很必要。直接看下圖:

關于plist檔案的那些事
關于plist檔案的那些事
關于plist檔案的那些事

 我已經在上面都标注了一下用到的檔案夾以及檔案的作用,相信大家應該對整個目錄結構有一個整理的了解。現在繼續談談plist檔案。

    用例子說明:比如我要做一個通訊錄,想用plist檔案去存放每個人的基本資訊,包括姓名和電話。想要實作的最終效果是:

關于plist檔案的那些事

 那麼我就可以這樣做:

第一步:我先獲得剛才所說的那個存放我們自己建立的檔案的目錄documents。

第二步:相當于字元串拼接,擷取那個user.plist的絕對路徑。

第三步:我建立一個nsmutablearr,裡面的資料來自于path所指向的檔案,即plist檔案。這樣的話檔案中的資料就可以寫到totalarr中了

注意,這裡可能user.plist檔案不存在,是以如果這個檔案不存在,那麼totalarr是沒有建立成功的,是以加一個判斷,如果totalarr沒有建立成功(因為path下沒有這個檔案),就建立一個。

第四步:建立一個字典,然後把字典放到totalarr中。

第五步:将totalarr寫入plist檔案中。

 注意:如果path下地那個檔案不存在,這個writetofile方法會自動建立一個user.plist檔案。然後将totalarr中的資料寫進去。

這樣就完成了。

    注意:plist檔案寫入時(即[totalarr writetofile:path atomically:yes];),會先清空整個plist檔案,然後從新将totalarr寫到裡面,是以為了儲存原來寫入的資料,需要在原來數組的基礎上再加入一個新的dic( [totalarr addobject:dic]; ),這樣就可以把原來的資料一塊寫入了。

    也許你會想直接在supporting files中建立一個plist檔案不行麼?答案是不行。具體原因可能如下:

關于plist檔案的那些事

  從上圖可以看出,我建立的plist檔案在項目檔案夾下,根本沒有在沙盒中。而且雖然我可以對這個檔案進行讀操作(用nsbundle操作),但是經過測試發現無法對其進行操作,具體原因不太清楚。

 但是我用

去擷取testpath時發現它的路徑如下:

    /users/admin/library/developer/coresimulator/devices/f73d2947-21cc-4e8e-ae3e-d80e6652d840/data/containers/bundle/application/c77e606f-ab5b-425a-bd2f-bc7b6b078187/test.app/test.plist

    仔細觀察,原來這個檔案是test.app中的檔案,這樣也合情理,因為這個test.app就是應用程式。我用上面的寫入方法去寫入資料時,發現我打開test.app下地test.plist。裡面确實有資料,也就是說我把資料寫進去了,但是當我檢視supporting files檔案夾下那個test.plist時,裡面沒有資料。而在次運作程式時,那個test.app會重新生成。裡面的資料也都消失了。