天天看點

《Core Data應用開發實踐指南》一2.7 屬性的各種設定選項

本節書摘來自華章出版社《core data應用開發實踐指南》一書中的第2章,第2.7節,作者 (美)tim roadley,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

圖2-5右側是data model inspector,開發者可以在這個界面中配置類型之外的其他屬性選項。選中某個屬性之後,按“option++3”組合鍵,即可顯示該界面。可供配置的選項根據屬性的類型而有所變化。并不是每一種屬性都能配置下列選項:

transient 如果在properties中勾選了這一項,那麼該特性就不會寫入持久化存儲區了。“不寫入持久化存儲區的特性”聽上去有些奇怪,但有的時候,隻需把特性留在托管對象上下文裡面就行了。比方說,你需要計算某個臨時的值,而這種值就可以放在transient特性中,此特性會留在上下文裡,進而能夠得益于撤銷或重做等功能。

optional optional特性并不一定要有值。所有的特性在剛建立出來的時候都是optional特性。如果某特性不是optional特性,那麼在把這個非optional特性放回存儲區的時候,它必須具備有效的值才行。

indexed 系統會優化indexed特性以提升搜尋效率,但代價是要在底層的持久化存儲區中占用額外的空間。這些額外空間的大小要根據待索引的資料量來定。如果不打算搜尋某個屬性,那麼就不要勾選indexed,這樣可以節省一些空間。

validation 你可以使用validation中的各個選項來阻止不合理的資料進入持久化存儲區。每一種數值型的屬性類型都支援相同的validation(驗證)選項,也就是可以規定其最小值與最大值。同理,對于字元串類型或日期類型的屬性來說,也可以限定其字元串長度或日期範圍。無效的值其實也可以出現在托管對象上下文裡面,隻要在調用save:之前能把這個問題解決就行。一般來說,應該在使用者試圖将焦點從輸入控件(比如uitextfield)中移開的時候驗證資料。

default 除了可變資料類型與二進制資料之外,其餘類型的屬性都可以具備預設值。如果開發者不給屬性指定具體的值,那麼它們的初始值就是預設值。考慮到後端sqlite資料庫處理null值的方式,筆者覺得應該給數值型的屬性設定預設值。對于字元串類型的屬性來說,預設值要依照具體情況來定,也就是說,得根據自己的需求來為這種屬性選擇适當的預設值。而對于日期類型的屬性來說,開發者則無法在model editor中把它的預設值設為“now”(目前時間)。

allows external storage 開啟了該選項之後,類型為二進制資料的屬性就可以把大量資料儲存在持久化存儲區之外了。假如要儲存照片、音頻、視訊等資料量非常大的媒體檔案,那麼筆者推薦你啟用該選項。啟用之後,core data會自動把資料量超過1mb的屬性值儲存在sqlite持久化存儲區之外。但如果底層的持久化存儲區是xml格式(注意,ios不支援這種格式的存儲區),那麼該選項不起作用。

index in spotlight 這個選項不會影響ios應用程式,它的用途是把基于core data的mac應用程式同spotlight內建起來。spotlight是一種搜尋機制。在mac作業系統中,螢幕右上角會有個“放大鏡”圖示,使用者點選該圖示之後,即可利用該機制來搜尋。mac應用程式的某個core data 屬性如果啟用了index in spotlight選項,那麼它的值就會出現在spotlight的搜尋結果中。core data會建立一種長度為0的隐藏檔案,用以表示持久化存儲區中的記錄,而spotlight在執行搜尋的時候,則會尋找這種檔案。如果持久化存儲區裡某個屬性的值變了,而這個屬性又啟用了index in spotlight選項,那麼存儲區外對應的那個檔案也會随之自動更新。

store in external record file 啟用了該選項之後,系統會把持久化存儲區裡的資料複制成xml格式,并儲存在存儲區之外。該選項如果和index in spotlight選項一起啟用,那麼在建立供spotlight所用的“索引檔案”(index file)時,檔案裡面就會填有一些值。除非有特殊需要(比如為了調試),否則筆者不建議開啟此選項。假如想通過“external records”(外部記錄)給其他應用程式提供資料,那麼請注意:包含records的目錄其結構可能會改變。

name 如果某個屬性的類型是可變類型,那麼名稱這一欄中填寫的名稱将會用作nsvaluetransformer子類的名稱,而這個子類會知道如何在任意的類與nsdata之間互相轉換。

請按下列步驟修改grocery dude,為相關的屬性啟用indexed選項并配置其預設值:

勾選name 屬性的indexed選項。

将name 屬性的default value(預設值)設為new item。

将quantity 屬性的default value設為1。

将listed 屬性的default value設為yes。這樣一來,新建立的item就會出現在購物清單中了。

将collected 屬性的default value設為no,這麼做是為了使購物清單中的新item不會處于“打上對勾”(ticked off)的狀态。