2013-01-24 36 views
2

可以将-[NSManagedObjectContext executeFetchRequest:error:]-[NSFetchedResultsController performFetch:]返回给用户以及应如何处理这些错误?我无法在文档中找到有关这些方法可能出现的错误的任何信息。也没有在CoreData/CoreDataErrors.h中定义的错误代码似乎适用于提取。核心数据提取返回什么样的错误?

现在我的错误处理的核心数据读取只是一个NSAssert这样的:

NSError *fetchError = nil; 
NSArray *fetchedResults = [context executeFetchRequest: request error: &fetchError]; 
NSAssert(fetchedResults, @"Error fetching: %@", fetchError); 

测试时我从未有过这种说法失败了,但这并不意味着这不能失败。优雅地处理这些错误的最佳做法是什么?

回答

-1

首先是捕获错误,但完全取决于代码的上下文,以便何时优雅地处理它,或者当您想要断言并在事情出错时停止其他事情。

还要记住,fetchedResults可以返回不为零,没有结果(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 .. 
+2

可可要求您使用'NSError'前检查直接返回值,而不是错误是否是'nil'。错误是[有保证](http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError.html#//apple_ref/doc/uid/TP40001806-CH204-SW1)到如果该方法指示失败,则该方法有效,但相反 - 即成功为“nil” - 即使事先将其设置为“nil”,也不会得到保证。 –

-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来让开发人员知道他们需要处理什么。

+0

Cocoa要求你在使用'NSError'前检查直接返回值,而不是错误是否为'nil'。错误是[有保证](http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError.html#//apple_ref/doc/uid/TP40001806-CH204-SW1)到如果该方法指示失败,则该方法有效,但相反 - 即成功为“nil” - 即使事先将其设置为“nil”,也不会得到保证。 –

+0

你仍然不需要检查'&&错误';如果'fetchedResults'为'nil',那么错误是有效的,或者有什么更深的错误。 –

+0

如果用户无法对此做任何事情,那么仅向用户显示错误并不是很好。对于在后台运行的代码(可能是将本地数据存储与Web服务同步),我不想用与他目前在我的应用中执行的操作无关的错误警报来打扰用户。 – Sven

0

你已经发现CoreDataErrors.h,也看到可能发生将是例如SQLite查询错误的Core Data Constants Reference

可能的错误。我隐约记得看到类似的东西,当我在一个谓词中使用了一个操作时,它被翻译成支持核心数据的SQLite版本不支持的东西。

如果在开发过程中被捕获,则纯粹使用NSError进行调试。如果这在运行时发生在已经发布的应用程序中,则选项将优雅地失败,并且如果可能的话可以要求用户指定不同的搜索格式。

1

执行提取请求时,我使用空数组填充期望的数组,而不是将其留空。

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:

+0

我喜欢这个想法,只是假装没有结果,如果有错误。但是我仍然想知道会发生什么样的错误。 – Sven

+0

无效的请求数据(如不在模型中的实体或属性)会导致核心数据引发异常。我还没有发现标准持久性存储类型填充错误(而不是引发异常)并返回nil的任何实例。 –