我已经看过所有发布报告问题的帖子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;
}
}
此外,当我捕捉到异常,新的对象是持久的。
非常感谢您的回答,它对我的帮助非常大。难以置信地混淆了为什么最初执行搜索,但添加/删除时崩溃。 YOU DA MAN –
@Josh O'Connor很高兴为您提供帮助。自从我挖掘这些战壕以来,我只能希望CoreData变得更好。您的评论不会有太多的建议。事后看来,我应该直接去SQLite ......我会在那里咬我的舌头。 – stephen