以上是我的数据模型图。 每当我创建一个包含模型和制作的汽车时,它会向核心数据添加汽车对象。 问题是它还为核心数据添加了1个make和1个模型,因此我得到重复。
例如,在下面的代码中,它保存了1个汽车对象2个模型,并且2个, 所以我在我的表中得到了一个副本(2“Nissan”)。 我怎么能避免这个?是否可以创建主键?
在下面的示例中,我想假设make和models已经存在,并且汽车只引用它们,那么如何避免插入make,model,并且只插入汽车?
- (void)MyCode
{
[self AddCar:@"Nissan" @"Rogue"];
[self AddCar:@"Nissan" @"Murano"];
}
- (void)AddCar :(NSString*)_make :(NSString*)_model
{
Car *car = [[Car alloc] initWithEntity:[NSEntityDescription entityForName:@"Car"
inManagedObjectContext:self.managedObjectContext]
insertIntoManagedObjectContext:self.managedObjectContext];
Make *make = [[Make alloc] initWithEntity:[NSEntityDescription entityForName:@"Make"
inManagedObjectContext:self.managedObjectContext]
insertIntoManagedObjectContext:self.managedObjectContext];
make.name = _make;
Model *model = [[Model alloc] initWithEntity:[NSEntityDescription entityForName:@"Model"
inManagedObjectContext:self.managedObjectContext]
insertIntoManagedObjectContext:self.managedObjectContext];
model.name = _model;
car.make = make;
car.model = model;
[self saveContext];
}
答案 0 :(得分:2)
这里有一些问题。
数据模型显示Make
和Model
实体各自与Car
具有一对一的关系。因此,每个Car
只能有一个Make
,每个Car
只能有一个Model
。换句话说,鉴于该数据模型,日产只能生成一个Car
。您可能希望在cars
中建立多个Model
关系,以便日产可以生成多个Car
。与Make
相同,因此可以存在多个具有给定Car
的{{1}}。
将Make
插入托管对象上下文的方式不正确。它应该这样做:
NSManagedObject
最后,您的代码显示为每个Car *car = [NSEntityDescription
insertNewObjectForEntityForName:@"Car"
inManagedObjectContext:self.managedObjectContext];
创建了一个新的Make
和Model
实体。如果您使用Car
的名称开头,则可能需要在托管对象上下文中搜索具有匹配名称的Make
。如果找到,只需将新Make
的{{1}}关系设置为已在上下文中的make
实体。如果未找到,请创建一个新的Car
实体并与之建立关系。
答案 1 :(得分:1)
不要创建新品牌和型号,而是使用已存储在核心数据中的品牌和模型。
编写一个使用NSPredicate搜索品牌和型号的控制器。像这样的东西:
- (id)modelNamed:(NSString *)searchName addIfMissing:(BOOL)add {
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:self.entityName inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", searchName];
[request setPredicate:predicate];
NSError *error;
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
if (!results) {
LogError(@"Error [%s], %@, %@", _cmd, error, [error localizedDescription]);
return nil;
}
if ([results count] == 0) {
if (add) {
// add model with new name...
id newModel = ...
return newModel;
}
else
return nil;
}
return [results objectAtIndex:0];
}