创建NSEntityDescription后抛出异常秒

时间:2012-06-08 13:29:59

标签: ios core-data nsentitydescription

  • 我的数据模型中有一个车辆实体。
  • 它有名称,品牌,型号等属性。
  • 我有一个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;
}

当窗口关闭,然后我返回到我的表视图控制器时,我可以在那里看到新元素。 (此表链接到fetch语句)。一切都很好。

然后大约4-6秒后,我抛出异常。底部的调试日志没有显示任何内容,它将我带到第一行中断的Thread 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的自动保存发生了一段时间后发生了吗?

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

谢谢!

1 个答案:

答案 0 :(得分:0)

事实证明,我将模型中的实体从Car改为Vehicle。我通过代码传播了更改,但模拟器仍然保存了应用程序。应用程序内的数据库中仍然存有原始汽车,但现在它们被称为“车辆”。

这导致保存后发生异常。

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

谢谢!