0
  • 我的数据模型中有一个车辆实体。
  • 它具有名称、品牌、型号等属性。
  • 我对 NewVehicleViewController 有一个模态 segue,它允许用户输入实体信息。
  • 在这个 segue 期间,我已将 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;
}

当窗口关闭时,我返回到我的 Table View 控制器,我可以在其中看到新元素。(此表链接到 fetch 语句)。一切都很好。

然后大约 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 的自动保存在一段时间后发生的吗?

我的第二个问题是,我怎样才能进一步调试它以找出问题所在?

谢谢!

4

1 回答 1

0

结果,我将模型中的实体从 Car 重命名为 Vehicle。我通过代码传播了更改,但模拟器仍然保存了应用程序。应用程序内的数据库中仍然存储着原始的 Cars,但现在它们被称为 Vehicles。

这导致保存后发生异常。

我最终从模拟器中删除了该应用程序,然后再次运行它,它工作了。

谢谢!

于 2012-06-08T15:36:28.613 回答