2011-09-04 34 views
2

所以我在UITableView中顯示了一些實體。點擊一個單元格我想顯示其他實體已被查詢過的「一對多」關係。已查詢實體的部分

例如,我顯示一所學校的所有課程。現在我想顯示一個班的所有學生。這個學生已經可以作爲NSSetClass.students

現在我想顯示學生在不同的部分下面的第一個字母。

,如果我想直接從CoreData得到他們,我會做一些像

// init fetch request 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.managedObjectContext]; 

// Search only specific students 
[fetchRequest setEntity:entity]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"class == %@", theClassThoseStudentsBelongTo]; 
[fetchRequest setPredicate:predicate]; 

// Generate it 
NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
             managedObjectContext:self.managedObjectContext 
              sectionNameKeyPath:@"firstLetter" 
                cacheName:@"StudentTable"]; 

用這種方法,我會得到他們很好的安排段。

但是我已經有了一個特定班級的所有學生。有沒有辦法初始化一個NSFetchedResultsController初始化爲NSSet或做一些平等?

當然,我可以手動安排我的NSSet,但不是有這樣一個很好的方式就像它是一個新的查詢?

在此先感謝。 如果不清楚請留下評論。

+0

好奇的答案,我很久以前就有過這個問題,並採取了手動實施一切(不難做,但不方便,不優雅)的岩石之路。 – Till

+0

你想要在單個tableview中完成所有這些工作嗎?或者您是否使用Class - >> class.students設置了分層tableview設置? – TechZen

+0

我有一個「班級」的桌面視圖,然後點擊一個班級後,一個桌面與「學生」。 – choise

回答

1

我猜你只有兩種選擇:使用NSFetchedResultsController或整理你自己的對象。

NSFetchedResultsController & NSPredicate:
優點:容易對象deletition;模型變化的通知,例如期間同步
缺點:不必要重取

的NSSet & NSSortDescriptor
優點:沒有重取 缺點:複雜deletition;沒有模型更改的通知,例如在同步期間:您可能正在顯示一個已經被刪除的學生

0

你可以使用NSPredicate它採用反向關係(從你的學生回到類)

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
... 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"class == %@", theClassThoseStudentsBelongTo]; 
[fetchRequest setPredicate:predicate]; 

NSFetchedResultsController *theFetchedResultsController = ... 
+0

但是這不是從sqlite數據庫再次查詢學生? – choise

+0

最有可能的。您可以選擇使用更多查詢的NSFetchedResultsController,也可以在部分中手動排列對象。 –

0

NSFetchedResultsController獲取的對象關係作爲錯誤出發,只在需要時才提取。這意味着如果我們不爲第一個tableView使用「學生」實體,只有在我們需要時纔會加載它。

但是,由於您需要知道學生人數,因爲調用[class.students count]會引發錯誤,所以情況稍微複雜一些。 (調用KVO @count也會觸發故障)。

所以,你有兩個選擇:

  1. 管理,反映實體的學生人數在課堂上被稱爲studentsCount的屬性。調用此屬性不會引發關係錯誤。
  2. 使用countForFetchRequest:

    NSFetchRequest *req = [[NSFetchRequest alloc] init]; 
    [req setEntity:[NSEntityDescription entityForName:@"Student" inManagedObjectContext:context]]; 
    [req setPredicate:[NSPredicate predicateWithFormat:@"class = %@", myClass]]; 
    

第二個選項進行提取,而是一個非常高效的,所以也許它的效率不夠高 - 我沒有做性能測試,所以我真的不能說。順便說一下,如果您不確定關係是否觸發了錯誤,那麼您可以使用hasFaultForRelationshipNamed方法。