0

在具有選項卡式視圖的應用程序上使用核心數據。第二個選項卡加載核心數據,沒有錯誤顯示在Xcode或當我運行應用程序,但當我點擊第二個選項卡上的應用程序崩潰的錯誤「NSFetchedResultsController的實例需要非零提取請求和managedObjectContext。NSFetchedResultsController需要非零提取請求和managedObjectContext錯誤

我是新來的核心數據,真正有此錯誤掙扎所以希望得到任何幫助,我可以得到的。在實現文件具有下面的代碼

- (void)setupFetchedResultsController 
{ 
    // 1 - Decide what Entity you want 
    NSString *entityName = @"EatCategory"; // Put your entity name here 
    NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName); 

    // 2 - Request that Entity 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; 

    // 3 - Filter it if you want 
    //request.predicate = [NSPredicate predicateWithFormat:@"EatCategory.name = Blah"]; 

    // 4 - Sort it if you want 
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" 
                        ascending:YES 
                         selector:@selector(localizedCaseInsensitiveCompare:)]]; 
    // 5 - Fetch it 
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                     managedObjectContext:self.managedObjectContext 
                      sectionNameKeyPath:nil 
                        cacheName:nil]; 
    [self performFetch]; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self setupFetchedResultsController]; 

    if ([[self.fetchedResultsController fetchedObjects] count] == 0) { 
     NSLog(@"No Results were fetched so nothing will be given to the table view"); 
    } 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Eat Category Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

    } 

    // configure the cell... 
    EatCategory *eatcategory = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    cell.textLabel.text = eatcategory.name; 

    return cell; 
} 


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     [self.tableView beginUpdates]; // Avoid NSInternalInconsistencyException 

     // Delete the role object that was swiped 
     EatCategory *eatCategoryToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
     NSLog(@"Deleting (%@)", eatCategoryToDelete.name); 
     [self.managedObjectContext deleteObject:eatCategoryToDelete]; 
     [self.managedObjectContext save:nil]; 

     // Delete the (now empty) row on the table 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     [self performFetch]; 

     [self.tableView endUpdates]; 
    } 
} 

回答

1

你確定你是正確的設置管理對象上下文?似乎取回請求沒有問題,但情況如何?如果上下文設置不正確,可能會導致該錯誤。

您是否從外部對象注入上下文?如果是,如何聲明managedObjectContext屬性?

例如:

// from an external object 
YourController *controller = ... // alloc-init the controller 
controller.managedObjectContext = self.managedObjectContext; 

// within your controller .h 
@property (strong, nonatomic) NSManagedObject* managedObjectContext; // or retain if you don't use ARC 

// within your controller .m 
@synthesize managedObjectContext; 

你也可以抓住從應用程序委託你的控制器內的主要方面(如果你已經宣佈它有)類似如下:

AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext* managedObjectContext = delegate.managedObjectContext; 

但這可能導致更嚴格的應用程序設計。

的一些注意事項

而不是使用commitEditingStyle你可以 「註冊」 爲NSFetchedResultsControllerDelegate回調。此類已創建用於處理表視圖中的更改。您可以使用它並以不同的方式響應表格更改。

這裏是NSFetchedResultsControllerDelegate的類參考。

希望它有幫助。

+0

確定它看起來像我沒有設置託管的對象上下文 - 我將有一個播放,看看我能否得到它的工作。謝謝 – Jadzia

+0

噢,我的... thx代表方法,你救了我的生活傢伙! – Kutyel

+0

@Kutyel樂意幫忙;) –

相關問題