1

Core Data を使用して外部データを SQLite に追加/既存のデータを更新しようとしています。

基本的に、外部 Web サービスから JSON を受け取り、次のコードを使用して、DB に新しいオブジェクトを追加するか既存のオブジェクトを更新する必要があるかを調べています。

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"name" inManagedObjectContext:context]];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"id = %@", [data valueForKey:@"key"]]];
NSArray *results = [context executeFetchRequest:fetch error:nil];

if (results.count == 1)
{
    // update existing
}
else
{
    // add new
}

問題は、次のコードが例外を引き起こす場合があることです。

Thread 1: EXC_??? (11) (code=0, subcode=0x0)

例外はで発生しますNSManagedObjectContext executeFetchRequest:error:

アプリの実行を続けると、すべて問題ないようです。

この例外について心配する必要がありますか?

私はそれを持っているのはちょっと面倒ですが、この例外の原因と結果を知ることはより重要ですか?

いくつかの追加の詳細 (関連する場合に備えて):

  • 上記のコードは、ループ内で複数回 (約 25 万回) 実行されます。
  • コードはメイン スレッドで実行されます (ええ、知っていますが、これはプロトタイプのようなものです)。
  • メインスレッドでコンテキストが作成されました。
  • 外部データはバックグラウンド スレッドで作成されます

[編集]いくつかの詳細:

  • executeFetchRequest:error例外が発生した場合でも、初期化された配列を返します。
  • errorパラメータを指定してもエラーは発生しませんexecuteFetchRequest:error
4

1 に答える 1

1

それは安全ではありません。

メソッドの戻り値をチェックして、配列が返されたことを確認する必要があります

NSArray *results = [context executeFetchRequest:fetch error:nil];
if (!results) {
    // An error occurred you should probably use the out error
}

また、CoreData は内部的に例外をスローするようですが、それらを処理するため、例外ブレークポイントが設定されている場合、CoreData スタックからのランダムなポイントでキャッチされる可能性が最も高くなります。このビデオで言及されているデバッグのヒント - マイク・ヘイ

于 2013-02-11T15:38:51.710 に答える