Core Data-Part2
上一篇中,僅對於基本的Core Data的流程有個初步的概念,但是光看NSLog訊息還是有點生疏,而且依照我目前的程度,是很少去修改到AppDelegate的部份,所以接著嘗試試著修改Master Detail Application看看。
最後的結果是希望可以在Table View中看到我新增的姓名,點選該姓名可以看到該姓名的電話。
**Step 1.**建立Master Detail Application的專案,專案名稱為core data example。
**Step 2.**開啟core_data_example.xcdatamodeld,將原本專案預設的Entity刪除,另外新增一個Phone的Entity,並新增兩個Attributes,name、number,如下圖。
**Step 3.**新增Managed Object Model,對著專案右鍵New File➔iOS➔Core Data➔NSManagedObjectsubclass,接著會自動新增二個檔案,Phone.m跟Phone.h。
如果沒有直接自動產生,應該會出現以下的畫面,只需要勾選並且下一步即可。
**Step 4.**修改MainStoryboard.storyboard。
在Navigation的右方加入一個Bar Button Item,點選新增是會跑到上面的畫面,讓我們新增姓名還有電話,下面則是點選姓名時可以看到該姓名的電話。因此需要新增一個AddDetailViewController來控制該新增畫面。在此就不多贅述。
**Step 5.**編輯AddDetailViewController。
- import
Phone.h,因為需要透過它來得知Entity的name、number。 - import
AppDelegate.h,因為需要使用它裡面的NSManagedObjectContext,所以在此無需重複定義。 - 二個
UITextField顧名思義就是對應到畫面上二個Text使用的。 app就是要用來引用NSManagedObjectContext。save就是在新增的畫面的Navigation右方,按下save按鈕儲存資料。
1 |
|
第5行,取得AppDelegate的delegate
第6行,透過app取得AppDelegete的NSManagedObjectContext
第7行,定義要加入的Entity是Phone。
第9行,用一個if檢查欄位的值是否為空白,當不是空白的時候才寫入。
第18~22,當寫入發生錯誤時才會執行。
1 | @synthesize name = name_, number = number_, app; |
**Step 6.**編輯MasterViewController.m。
這裡僅需要搜尋Event,並且改成Phone取代(因為Entity已經被我換掉了),還有搜尋timeStamp,並且改成name取代(因為Attribute已經不是timeStamp,我們在Table View中希望呈現姓名,因此改成name)。
最後記得要將viewDidLoad內的方法刪除,僅留下第一行即可(如下)。
1 | - (void)viewDidLoad |
**Step 7.**編輯DetailViewController
因為比原本的專案多了一個UILabel元件,所以要多定義一個,並且找到configureView方法,加入第8行設定detailNumber,而valueForKey記得要修改成跟Entity對應的name、number。
1 |
|
1 | @synthesize detailNumber = _detailNumber; |
Step 8.建立關連
最後就是將元件跟IBOutlet、IBAction建立關連,在此就不多做贅述了。
範例下載:Download here