2013-01-24 58 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的任何實例。 –