核心数据获取可以返回什么样的错误?

时间:2013-01-24 15:36:58

标签: ios objective-c cocoa core-data

-[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 );

在测试时我从来没有让这个断言失败,但这并不意味着这不会失败。优雅地处理这些错误的最佳做法是什么?

4 个答案:

答案 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是框架用来让开发人员知道他们需要处理什么的东西。