Создайте новый объект с текущим объектом, используя MagicalRecord

Я пытаюсь создать новую сущность, используя существующую сущность (переданную), установив все значения. Вот метод класса, который я использую в подклассе управляемых объектов:

+(FlightManifest *)getNextFlightManifestLegWithFlightManifest:(FlightManifest *)fm {
    // Get the current context
    NSManagedObjectContext *moc = [NSManagedObjectContext MR_contextForCurrentThread];

    // Set a var to the cur leg so we can use it to increment the leg number later
    NSInteger curLeg = [fm.leg intValue];

    // Check to see if we already have the next leg saved
    if ([self getFlightManifestWithTripID:fm.tripid andLeg:[NSNumber numberWithInt:curLeg + 1]] !=nil) {
        return [self getFlightManifestWithTripID:fm.tripid andLeg:[NSNumber numberWithInt:curLeg + 1]];
    } else {
        // Create a new leg using the passed in FlightManifest for the values
        FlightManifest *newFM = [FlightManifest MR_createInContext:moc];  

        // Set the value of the newly created object to the one passed in
        newFM = fm;

        // Increment the leg number
        newFM.leg = [NSNumber numberWithInt:curLeg + 1];

        // Save the object
        [moc MR_save];

        return newFM;
    }
}

И я называю это так:

- (IBAction)nextLegButtonPressed:(id)sender {

    currentFlight = [FlightManifest getNextFlightManifestLegWithFlightManifest:currentFlight];
    self.legNumberLabel.text = [currentFlight.leg stringValue];
    [self reloadLegsTableViewData];
}

Происходит то, что я меняю текущий объект вместо создания нового. Любые идеи о том, что я делаю неправильно?


person LJ Wilson    schedule 07.06.2012    source источник
comment
Вам нужно поделиться кодом для MR_createInContext   -  person melsam    schedule 07.06.2012
comment
Это часть API MagicalRecord.   -  person LJ Wilson    schedule 07.06.2012


Ответы (1)


Это может показаться очевидным, но эта строка кажется подозрительной:

// Set the value of the newly created object to the one passed in
    newFM = fm;

Это сделает код после использования существующего объекта fm... и изменит тот, который вы пытаетесь скопировать...

person casademora    schedule 07.06.2012
comment
Да, я пытаюсь скопировать все свойства из переданного, а затем изменить одно из этих свойств (ногу). Поскольку у ManagedObjects нет метода копирования, я не уверен, что еще можно сделать, кроме как установить каждое свойство следующим образом: newFM.tripid = fm.tripid; ... Кстати, это работает, но не кажется самым эффективным способом. - person LJ Wilson; 08.06.2012
comment
Это именно то, что вам нужно сделать :( Если вы выполняете глубокое копирование из одного управляемого объекта в другой, вы фактически скопируете весь граф объекта. В этом случае ручное копирование свойств кажется лучшим способом идти. - person casademora; 08.06.2012
comment
Хорошо, если вы добавите последний комментарий в свой ответ, я приму его. Спасибо. - person LJ Wilson; 08.06.2012