我查看了报告managedObjectContext save:
问题的所有帖子
但是,我没有找到任何似乎可以解决我所看到的问题的东西。大多数人都有使用tableView协调其FRC的问题。这是不同的。
当我在NSManagedObjectContext实例上调用save时,会出现此问题。捕获和记录异常读取:“无法使用非集合对象执行集合计算”。有没有人知道这可能是什么意思?
@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;保存;并遇到save抛出的异常。
有趣的是,每次都会发生这种情况,并且只有在我的谓词查询数字或日期时才会发生。查询字符串时会发生不。所以,我认为我的查询结构似乎是唯一的区别。事实是,两者都在创建有效的谓词(通过SUBQUERY),因为提取不会失败。所以,如果存在差异,我无法告诉你它可能是什么。
其他值得注意的事情是,我为每个地方分配一个FRC看起来像这样:
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
请注意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;
}
}
此外,当我捕获异常时,新对象将保持不变。
答案 0 :(得分:2)
我想我的工作太晚了......
从我收集的内容来看,当数据模型中感兴趣的属性的关键路径中没有多对多关系时,使用SUBQUERY填充NSPredicates是不好的做法。
这真的令人困惑,因为搜索仍然会执行,并返回我预期的结果。直到我添加了一个带有FRC的新托管对象之后,该对象与我的SUBQUERY谓词无关,表明问题已经出现。
我希望这有助于某人...