我已經看過所有發佈報告問題的帖子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