0
  • データモデルに車両エンティティがあります。
  • 名前、メーカー、モデルなどの属性があります。
  • NewVehicleViewControllerにモーダルセグエがあり、ユーザーがエンティティ情報を入力できるようになっています。
  • このセグエ中にmanagedObjectContextをNewVehicleViewControllerに渡しました
  • [完了]をクリックし、NewVehicleViewControllerのIBActionメソッド内からcreate + Vehicle.mのメソッドを呼び出すことにより、新しいNSEntityDescriptionを作成します。

    Vehicle * car = [Vehicle VehicleWithName:name inManagedObjectContext:self.context];

このメソッドは次のことを行います。

+ (Vehicle *) vehicleWithName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *) context
{
    Vehicle *vehicle = nil;

    //check for duplicates
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Vehicle"];
    request.predicate = [NSPredicate predicateWithFormat:@"name = %@", name];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    NSError *error;
    NSArray *matches = [context executeFetchRequest:request error:&error];
    NSLog(@"Matches: %d", matches.count);

    if(!matches || [matches count] >1){
        //nil or more than 1
    } else if ([matches count] == 0){
        //not found
        vehicle = [NSEntityDescription insertNewObjectForEntityForName:@"Vehicle" inManagedObjectContext:context];
        vehicle.name = name;
    }else{
        vehicle = [matches lastObject];
        NSLog(@"vehicle already exists with name: %@", name);
    }

    NSLog(@"Created vehicle with name: %@", vehicle.name);

    return vehicle;
}

ウィンドウを閉じてテーブルビューコントローラーに戻ると、そこに新しい要素が表示されます。(このテーブルはフェッチステートメントにリンクされています)。すべてが良いです。

次に、約4〜6秒後に、例外がスローされます。下部のデバッグログには何も表示されません。最初の行が途切れているスレッド8ビューが表示されます。

libobjc.A.dylib`objc_exception_throw:
0x1780caa:  pushl  %ebp
0x1780cab:  movl   %esp, %ebp
0x1780cad:  pushl  %ebx
0x1780cae:  pushl  %edi
0x1780caf:  pushl  %esi
0x1780cb0:  subl   $2028, %esp
0x1780cb6:  calll  0x01780cbb               ; objc_exception_throw + 17

だから私の最初の質問は、問題が何であるかという考えはありますか?これは、NS Core Dataの自動保存がしばらくしてから発生しているために発生していますか?

そして、私の2番目の質問は、問題が何であるかを見つけるために、これをさらにデバッグするにはどうすればよいでしょうか。

ありがとう!

4

1 に答える 1

0

モデル内のエンティティの名前を Car から Vehicle に変更しました。コードを介して変更を伝達しましたが、シミュレーターにはまだアプリが保存されていました。アプリ内のデータベースには元の車がまだ保存されていましたが、現在は車両と呼ばれています。

これにより、保存後に例外が発生していました。

シミュレーターからアプリを削除してから、もう一度実行するとうまくいきました。

ありがとう!

于 2012-06-08T15:36:28.613 に答える