2012-05-11 67 views
0

我已经看过所有发布报告问题的帖子managedObjectContext save: 但是,我没有发现任何似乎解决了我所看到的问题的任何内容。大多数人都有与tableView协调FRC的问题。这是不同的。NSManagedObjectContext保存方法抛出异常

当我调用保存在NSManagedObjectContext实例上时,会暴露此问题。捕获和记录异常读取:“无法执行集合评估与非集合对象”。有没有人有线索可能意味着什么?

@try { 
     if ([self.managedObjectContext hasChanges]) { 
      @synchronized(managedObjectContext) { 
       if(![managedObjectContext save:&error]) { 
        NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n UserInfo: \n%@, %@", error, [error userInfo]); 
        [self.managedObjectContext rollback]; 
       } 
      } 
     } 
    } 
    @catch (NSException *exception) { 
     NSLog(@"\n\n---------UNRESOLVED ERROR--------------\n\n exception: \n%@\n%@", exception, error); 
    } 

我唯一的线索是这个问题的可重复性。这发生在我将保留的fetchedResultsController访问器清零后,然后用一组谓词实例化一个新的。

 if(searchFetchedResultsController) { 
      self.searchFetchedResultsController = nil; 
     } 

     self.searchFetchedResultsController = [predicateBuilder createSearchInContext:managedObjectContext forDelegate:self withSortDescriptors:self.sortDescriptors forEntityName:@"Record"]; 

     NSError *error = nil; 
     [self.searchFetchedResultsController performFetch:&error]; 

     if(error) 
      NSLog(@"\nfetch error: %@", error); 

我稍后将通过使用普通存取器构造保留一个新的NSFetchedResultsController,而不带谓词。

 if(fetchedResultsController) { 
      self.fetchedResultsController = nil; 
     } 

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

我稍后将添加一个Record managedObject;保存;并运行保存引发的异常。

有趣的是,这种情况每次都会发生,只有当我的谓词正在查询数字或日期时。它在查询字符串时发生而不是。所以,我想我的查询结构似乎是唯一的区别。事实是,两者都在创建有效的谓词(通过SUBQUERY),因为获取不会失败。所以,如果有差异,我不能告诉你它可能是什么。

其他值得注意的事情是每一个I“的alloc”一个FRC它看起来像这样的地方:

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

注意零cacheName和sectionNameKeyPath

我用两个指针澄清我的预测FRC与非预测FRC。我知道如果我没有提到它,就会发现一些错误。

-(void) setSearchFilteredNames:(BOOL)boolValue { 
    searchFilteredNames = boolValue; 
    if(boolValue) { 
     self.searchFetchedResultsController.delegate = self; 
     self.fetchedResultsController.delegate = nil; 
     //self.fetchedResultsController = nil; //lazy regeneration 
    } else { 
     self.searchFetchedResultsController.delegate = nil; 
     //self.searchFetchedResultsController = nil; //lazy regeneration 
     self.fetchedResultsController.delegate = self; 
    } 
} 

此外,当我捕捉到异常,新的对象是持久的。

回答

2

我想我是工作到太晚......

从我所收集,这是不好的做法是使用子查询来填充NSPredicates当有关键路径中没有一对多的关系感兴趣的属性数据模型。

这真是令人困惑,因为搜索仍然会执行,并返回我期望的结果。直到我添加了一个FRC的新管理对象,这与我的SUBQUERY谓词无关,这个问题才表现出来。

我希望这可以帮助别人......

+0

非常感谢您的回答,它对我的​​帮助非常大。难以置信地混淆了为什么最初执行搜索,但添加/删除时崩溃。 YOU DA MAN –

+0

@Josh O'Connor很高兴为您提供帮助。自从我挖掘这些战壕以来,我只能希望CoreData变得更好。您的评论不会有太多的建议。事后看来,我应该直接去SQLite ......我会在那里咬我的舌头。 – stephen