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

テスト中に、このアサーションが失敗することはありませんでしたが、これは失敗できないという意味ではありません。これらのエラーを適切に処理するためのベスト プラクティスは何ですか?

4

4 に答える 4

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テスト-executeFetchRequest:errorでエラーケースをトリガーする方法がわからない:

于 2013-01-24T20:42:22.433 に答える
0

すでに見つかりました。Core Data Constants ReferenceCoreDataErrors.hも参照してください。

発生する可能性のあるエラーは、SQLiteクエリ エラーなどです。SQLiteコアデータをサポートするバージョンでサポートされていないものに変換された述語で操作を使用したときに、このようなものを見たのを漠然と覚えています。

開発中に問題が発生した場合は、NSError純粋にデバッグするために を使用します。すでにリリースされているアプリケーションで実行時にこれが発生した場合、オプションは正常に失敗し、可能であればユーザーに別の検索形式を指定するように依頼することです。

于 2013-01-24T17:45:40.707 に答える
-1

最初にエラーをキャプチャする必要がありますが、適切にエラーを処理したい場合や、問題が発生した場合に何か他のことをアサートして停止したい場合は、コードのコンテキストに完全に依存します。

また、fetchedResults は結果なし (カウント == 0) で nil 以外を返す可能性があることも覚えておいてください。これはエラーではありませんが、明らかにそれに対してコーディングする必要があるかもしれません。

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 ..
于 2013-01-24T15:50:36.367 に答える
-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開発者が何を処理する必要があるかを知らせるためにフレームワークが使用するものです。

于 2013-01-24T17:19:42.863 に答える