CoreData: Запазване на модифициран управляван обект като нов обект

Моето приложение позволява на потребителя да редактира данни, но по време на запазване има две неща, които могат да се случат:

  1. Ако името на данните е останало същото, просто запишете обекта като редактирана версия. т.е. те просто редактират съществуващия обект.

  2. Ако обаче са променили името, това трябва да създаде нов екземпляр и да възстанови редактираните данни до оригинала.

Очевидно 1 е лесният случай и работи добре. Но съм в конфликт относно най-добрия метод за справяне с 2. Колко най-добре е да запишете модифициран NSManagedObject като нов ред в DB?


person MarkPowell    schedule 23.10.2012    source източник


Отговори (1)


Няма очевиден начин просто да "копирате" NSManagedObject. Най-стабилният начин е просто да пресъздадете всичко от нулата.

Уверете се, че всички променени атрибути са съхранени отделно (тук предполагам, че са в различни текстови полета или че са непроменени от съществуващия обект). Можете да вземете това решение (нов екземпляр или не), когато вашият контролер за изглед на редактиране е отхвърлен:

if (![nameTextField.text isEqualToString:object.name]) {
   ObjectClass *newObject = [NSEntityDescription 
       insertNewObjectForEntityForName:@"ObjectClass" 
                inManagedObjectContext:self.managedObjectContext];
   newObject.name = nameTextField.text;
   newObject.attribute1 = oldObject.attribute1;
   // or
   newObject.attribute1 = attribute1TextField.text;
   // do this for all attributes
   [self.managedObjectContext save:nil]; 
}
person Mundi    schedule 24.10.2012
comment
Благодаря, това правех, но се чувствах толкова ръчно, че може би имаше някакъв трик, който пропусках. - person MarkPowell; 24.10.2012
comment
Добре, усеща се ръчно. ;-) Можете да стигнете до по-високо ниво на абстракция, като използвате KVC - но обикновено не е необходимо. - person Mundi; 24.10.2012