每次运行我的应用程序时,我都会突然收到以下错误:
CoreData:致命错误:部分信息的持久缓存与当前配置不匹配。你在没有禁用缓存或使用 +deleteCacheWithName 的情况下非法改变了 NSFetchedResultsController 的获取请求、谓词或排序描述符:
这是调用堆栈中的前十项:
*** First throw call stack:
(
0 CoreFoundation 0x04b835e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x022c68b6 objc_exception_throw + 44
2 CoreData 0x020a1b41 -[NSFetchedResultsController performFetch:] + 913
3 Syllable 0x00036aa9 -[RootViewController fetchedResultsController] + 777
4 Syllable 0x0003772b -[RootViewController tableView:numberOfRowsInSection:] + 91
5 UIKit 0x00d1d240 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 2510
6 UIKit 0x00d20b3d -[UITableViewRowData numberOfRows] + 98
7 UIKit 0x00ba94c2 -[UITableView noteNumberOfRowsChanged] + 120
8 UIKit 0x00ba8e6f -[UITableView reloadData] + 814
9 UIKit 0x10378ed1 -[UITableViewAccessibility(Accessibility) reloadData] + 50
10 UIKit 0x00bac8d3 -[UITableView _reloadDataIfNeeded] + 65
它提供了更多,但似乎都源于我发布的第一个错误。如果它们有帮助,请告诉我,我会发布它们。
不过,这个问题真的很奇怪。它似乎是凭空出现的。即使我使用 git 恢复到以前的工作版本,它仍然会崩溃,所以我不知道是什么原因造成的。
Stackoverflow 上发布了一个解决方案,但它有点令人不安。将缓存设置为零会从我的应用程序中删除缓存能力/使其变慢吗?会带来什么后果?
我正在对我的应用程序进行新的更新,首要任务是确保我的现有/未来用户不会崩溃。
编辑:我相信这是导致问题的原因(尽管我已经删除了它并且问题仍然存在):
我的 AppDelegate 中有以下代码applicationDidFinishLaunching
,它基本上用于在应用程序首次启动时在 Core Data 中创建一个特殊对象。在添加此问题后,问题似乎发生了,尽管此后不久删除了代码。我现在不应该操纵核心数据吗(是不是太早了)?
// If it's the first time launching, create and add a sample article for an introduction
if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"IsFirstTimeLaunching"] isEqualToString:@"YES"]) {
NSManagedObjectContext *context = self.managedObjectContext;
Article *article = [NSEntityDescription insertNewObjectForEntityForName:@"Article" inManagedObjectContext:context];
article.source = @"text";
article.body = @"some text";
article.timeStamp = [NSDate date];
NSError *error;
[context save:&error];
[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"IsFirstTimeLaunching"];
}
我的 AppDelegate 中也有这个块,它已经存在了很长一段时间,但老实说,我不确定它到底是做什么的,我可能只是写了它而忘记完成它......
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSManagedObjectContext *context = self.managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
}