iPhone - 核心数据问题?

时间:2010-10-09 17:47:23

标签: iphone core-data primary-key

alt text

以上是我的数据模型图。 每当我创建一个包含模型和制作的汽车时,它会向核心数据添加汽车对象。 问题是它还为核心数据添加了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];
}

2 个答案:

答案 0 :(得分:2)

这里有一些问题。

数据模型显示MakeModel实体各自与Car具有一对一的关系。因此,每个Car只能有一个Make,每个Car只能有一个Model。换句话说,鉴于该数据模型,日产只能生成一个Car。您可能希望在cars中建立多个Model关系,以便日产可以生成多个Car。与Make相同,因此可以存在多个具有给定Car的{​​{1}}。

Make插入托管对象上下文的方式不正确。它应该这样做:

NSManagedObject

最后,您的代码显示为每个Car *car = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:self.managedObjectContext]; 创建了一个新的MakeModel实体。如果您使用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];
}