iPhone - основные данные вопросы? - PullRequest
0 голосов
/ 09 октября 2010

alt text

Выше приведена моя диаграмма модели данных. Каждый раз, когда я создаю автомобиль, который содержит модель и марку, он добавляет объект автомобиля к основным данным. Проблема в том, что он также добавляет 1 модель и 1 модель к основным данным, поэтому я получаю дубликаты.

например, в следующем коде он сохраняет 1 объект автомобиля, 2 модели и 2 модели, поэтому я получаю дубликат Make в моем столе (2 "Nissan"). Как я могу избежать этого? Можно ли создать первичные ключи?

В следующем примере я хочу предположить, что марка и модели уже существуют, и автомобиль ссылается только на них, так как я могу избежать вставки в марку и модель и вставить только в машину? *

- (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 ]

2 голосов
/ 09 октября 2010

Здесь есть несколько проблем.

Модель данных показывает, что каждый из объектов Make и Model имеет отношение один к одному с Car. Следовательно, может быть только один Car для каждого Make и только один Car для каждого Model. Другими словами, учитывая, что модель данных, Nissan может сделать только один Car. Вы, вероятно, хотите иметь отношение cars ко многим в Model, чтобы Nissan мог создать более одного Car. То же самое с Make, так что может быть более одного Car с данным Make.

Неверный способ вставки NSManagedObject в контекст управляемого объекта. Это должно быть сделано так:

Car *car = [NSEntityDescription
    insertNewObjectForEntityForName:@"Car"
    inManagedObjectContext:self.managedObjectContext];

Наконец, ваш код показывает, что для каждого Car создаются новые сущности Make и Model. Если вы начинаете с имени Make, вы, вероятно, захотите выполнить поиск в контексте управляемого объекта для Make с соответствующим именем. Если найдено, просто установите отношение make нового Car к объекту Make, который уже находится в контексте. Если он не найден, создайте новый объект Make и установите для него отношение.

1 голос
/ 09 октября 2010

не создает новых марок и моделей, а использует те, которые уже хранятся в основных данных.

Напишите контроллер, который ищет марку и модель с 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];
}
...