4

我正在研究我的第一個核心數據支持的應用程序,並且無法正確地設置NSFetchedResultsController。我有兩個實體:NSFetchedResultsController/Parent-Child

/-----------\  /-----------\ 
| List  |  | ListItem | 
| --------- |  | --------- | 
| listName |  | itemName | 
| --------- |  | --------- | 
| listItems |<---->> | list  | 
\ ---------/  \ ---------/

我有兩個觀點(分別來自UITableViewController繼承和各由NSFetchedResultsController支持)。第一個視圖是UITableView,它顯示List項目的所有項目。當選中一行時,它將推動第二個視圖。

我在視圖控制器中有一個名爲@property (strong, nonatomic) List *selectedList的屬性,我在選擇List之前將其分配,然後再按下視圖。

我在設置時遇到的問題是,第二個視圖僅顯示ListItem對象,其父對象爲List。我知道這屬於NSFetchedResultsController,但我不知道在哪裏。

這裏是我的代碼:

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (__fetchedResultsController != nil) { 
     return __fetchedResultsController; 
    } 

    // Set up the fetched results controller. 
    // Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"ListItem" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set the batch size to a suitable number. 
    [fetchRequest setFetchBatchSize:20]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Detail"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return __fetchedResultsController; 
}  

我是否需要添加某種排序描述符,或者其答案是否是別的東西?謝謝!

回答

1

您需要一個NSPredicate來選擇ListItem s,其中selectedList匹配其list屬性。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list == %@", self.selectedList]; 
[fetchRequest setPredicate:predicate]; 

有一兩件事要注意的這裏,那就是根據selectedList意義的讀取請求將改變謂詞將發生變化。如果您要更改提取請求,Apple會在NSFetchedResultsController Class Reference中發出此警告。

您不能簡單地更改獲取請求來修改結果。如果 你想改變的讀取請求時,你必須:

  1. 如果您使用的是高速緩存,刪除它(使用+deleteCacheWithName:)。

  2. 通常,如果要更改提取請求,則不應使用緩存。

  3. 更改提取請求。調用-performFetch: