-[NSManagedObjectContext executeFetchRequest:error:]
和-[NSFetchedResultsController performFetch:]
可以向用户返回哪些错误以及如何处理?我在文档中找不到有关这些方法可能出错的任何内容。此外,CoreData/CoreDataErrors.h
中定义的错误代码似乎都不适用于提取。
现在我对Core Data提取的错误处理只是NSAssert
,如下所示:
NSError *fetchError = nil;
NSArray *fetchedResults = [context executeFetchRequest: request error: &fetchError];
NSAssert( fetchedResults, @"Error fetching: %@", fetchError );
在测试时我从来没有让这个断言失败,但这并不意味着这不会失败。优雅地处理这些错误的最佳做法是什么?
答案 0 :(得分:1)
执行获取请求时,我使用空数组填充预期数组,而不是将其保留为nil。
NSError *error;
NSArray *array = [context executeFetchRequest:request error:&error];
if (array == nil)
{
NSLog(@"Error retrieving array of values %@", error);
array = [NSArray array];
}
如果你想测试你的错误处理,这个答案详细说明了如何实现一个每次都会给你一个错误的NSPeristentStore。
Core Data Unit Testing - Unsure how to trigger error case in executeFetchRequest:error:
答案 1 :(得分:0)
您已找到CoreDataErrors.h
,另请参阅Core Data Constants Reference
可能发生的错误可能是SQLite
查询错误。我依稀记得看到这样的事情,当我在谓词中使用一个操作时,该操作被翻译成支持核心数据的SQLite
版本不支持的内容。
如果在开发过程中被捕获,则纯粹使用NSError
进行调试。如果在运行时在已发布的应用程序中发生这种情况,则选项将优先失败,并且如果可能,请要求用户指定不同的搜索格式。
答案 2 :(得分:-1)
首先要捕获错误,但它完全取决于代码的上下文,以及何时要优雅地处理它,或者如果出现问题则要断言和停止其他任何事情。
还要记住,fetchedResults可以返回非nil,没有结果(count == 0),这不是错误,但你显然可能想要对此进行编码。
NSError *fetchError = nil;
NSArray *fetchedResults = [context executeFetchRequest: request error: &fetchError];
if (fetchError) {
NSLog(@"Error with fetch: %@",error);
// Assert or do whatever is required ..
}
// Continue as normal ..
答案 3 :(得分:-1)
我总是将这些错误传递给NSResponder链,因此:
NSManagedDocument _document;
NSManagedObjectContext _moc;
NSError *error = nil;
NSArray *result = [_managedObjectContext executeFetchRequest:fr error:&error];
if (fetchedResults == nil && error) {
[_document presentError:error];
// or, if this isn't a document-based app, you can do
// [NSApp presentError:error];
// or, if this method is in an IBAction you can just do
// [sender presentError:error];
// and it'll just do the right thing
}
NSManagedDocument
中的默认实现可以很好地呈现这些错误,除非您保存文档并获得多个验证错误,在这种情况下您需要编写特殊内容。
如果有疑问,请尽快提交NSError
,如果您发现自己为NSError进行了大量的retval检查,那么您在发送错误返回功能时可能会遇到更多问题首先。
NSErrors
供用户解决; NSExceptions
是框架用来让开发人员知道他们需要处理什么的东西。