iPhone開發之CoreData(基礎篇)中已經學習了CoreData的理論基礎,是基於「Master-Detail Application」項目的代碼分析,這一篇直接進入實戰。框架
咱們從「Empty Application」一個空項目開始,命名爲TestCoreData,並勾選Use Core Data,在AppDelegate中Xcode已經爲咱們生成了CoreData基本代碼。函數
打開xcdatamodeld文件,點擊Add Entity按鈕添加實體,並命名這個實體爲Student,以下圖。學習
點擊Add Attribute按鈕(也能夠點擊」+」號)並添加三個屬性age、name、birth,類型分別爲Integer3二、String、Date,以下圖spa
一樣地再添加一個實體爲Course,並添加兩個屬性title、score,類型爲String、Integer32。code
如今Student、Course兩個實體就建立好了,接下來就要把這兩個實體關聯起來,先看看它們之間存在什麼樣的關係,以下圖。orm
從上圖能夠看出,Student和Course之間存在一對多的關係,選擇Student實體,在Relationships中添加一個courses關 聯,一樣在Course的Relationships中添加一個student關聯,reloationship的Destination和 Inverse以下圖所示對象
由於是一對多關係,因此在courses關係中要勾選「To-Many Relationship」,下圖紅色框選處ip
至此建模部分就完成了,咱們須要Xcode爲咱們生成ManagedObject的子類,新建文件選擇Core Data,建立基於NSManagedObject subclass,以下圖開發
選中Student和Course這兩個實體,點擊Next建立get
Xcode爲咱們生成了Student和Course的模型代碼。
按照這樣上面的思路來寫,在初始化函數中賦值managedObjectContext,獲取NSFetchedResultsController對象的代碼基本是模板化的代碼,把上篇中的代碼粘貼上去稍微改下就好了,在導航欄右邊添加」+」按鈕用來顯示添加學生視圖。
該視圖用來顯示學生的基本信息還有課程分數,ListingStudentViewController和DetailStudentViewController之間經過成員屬性student來傳遞變量,用UITextView來顯示學生課程分數。
- (void)setupPrototypes{ lblName.text = student.name; self.title = student.name; lblAge.text = [student.age stringValue]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; lblBirth.text = [dateFormatter stringFromDate:student.birth]; NSString *strTemp = @""; for (Course *course in student.courses) { strTemp = [strTemp stringByAppendingFormat:@"%@: %@分\r\n", course.title, course.score]; } txtCourse.text = strTemp;}
添加學生信息的流程也基本差很少,把模板代碼改下
- (IBAction)createButtonPushed{ Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:managedObjectContext]; student.name = txtName.text; student.age = [[NSNumber alloc] initWithInt:[txtAge.text intValue]]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; student.birth = [dateFormatter dateFromString:txtBirth.text]; NSError *error = nil; if (![managedObjectContext save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } [self.navigationController popViewControllerAnimated:YES];}
由於Xcode爲咱們生成了爲學生添加課程的方法addCoursesObject,因此咱們只要調用這個函數給學生添加課程,其它的事情由CoreData框架來處理
- (IBAction)addButtonPushed{ Course *course = [NSEntityDescription insertNewObjectForEntityForName:@"Course" inManagedObjectContext:managedObjectContext]; course.title = txtCourseName.text; course.score = [NSNumber numberWithInt:[txtCourseScore.text intValue]]; [student addCoursesObject:course]; NSError *error = nil; if (![managedObjectContext save:&error]) { // 錯誤處理. NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } [self.navigationController popViewControllerAnimated:YES];}
完整代碼