#objective-c #cocoa #core-data #core-data-migration
#objective-c #cocoa #ядро-данные #ядро-данные-миграция
Вопрос:
У меня есть объект A, который имеет два атрибута. Объект B имеет A в качестве родительского элемента и имеет дополнительные 3 атрибута. Изменения в новой версии не затрагивают объекты A и B.
Как я могу перенести объекты объекта B в новую версию моей модели данных, включая атрибуты из объекта A?
Я попытался использовать два сопоставления объектов: одно для A и одно для B, но «Атрибуты A» не были перенесены. В качестве альтернативы я бы добавил атрибуты A в сопоставление для переноса B, но там я не могу выбрать правильные атрибуты (в Xcode 4).
Редактировать:
Я имею в виду не обычную связь между двумя объектами, а наследование:
Правка 2:
Просто чтобы быть уверенным, я создал новый проект для тестирования. Здесь я добавил только два объекта, как показано выше. В моем awakeFromNib
я выполняю запрос на выборку, и если результаты не возвращаются, я добавляю новый объект:
NSManagedObject *newAccount = [[NSManagedObject alloc] initWithEntity:entityDesc insertIntoManagedObjectContext:[self managedObjectContext]];
// Account
[newAccount setValue:@"TheName" forKey:@"name"];
[newAccount setValue:[NSDecimalNumber decimalNumberWithMantissa:5 exponent:2 isNegative:NO] forKey:@"currentBalance"];
// BankDebitAccount
[newAccount setValue:@"TheAccountNumber" forKey:@"accountNumber"];
[newAccount setValue:@"TheBankName" forKey:@"bankName"];
[newAccount setValue:[NSDecimalNumber decimalNumberWithMantissa:6 exponent:1 isNegative:YES] forKey:@"openingBalance"];
Во второй версии модели данных я добавил новый объект и включил автоматическую миграцию через
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:dict error:amp;error]) {
Миграция действительно происходит, и три свойства из BankDebitAccount успешно перенесены. Свойство currentBalance из Account сбрасывается в 0, а свойство name больше не отображается в XML-файле (и, следовательно, равно нулю).
Правка 3: Я только что попытался открыть этот недавно созданный тестовый проект в Xcode 3 (.2.4). Когда я открываю модель сопоставления там и выбираю сопоставление моего дочернего объекта, я действительно могу добавить сопоставление атрибутов для родительских атрибутов:
Итак, я предполагаю, что это сделало бы это ошибкой в Xcode 4.
Ответ №1:
Я не уверен, что пошло не так.
Я только что создал эту модель данных версии 1, я надеюсь, что это максимально приближено к вашему случаю:
Затем я создал эту версию 2, никаких изменений в родительском и дочернем элементах, только один новый объект:
Я создал модель сопоставления, и это то, что она предложила автоматически:
Давайте посмотрим на различия:
Только одно изменение: новый соседний объект.
Можете ли вы опубликовать несколько фотографий вашей ситуации?
Обратите внимание, что это XCode3
Ответ №2:
Оказывается, это была ошибка в версии Xcode, которую я использовал в то время, и была устранена в Xcode 4.2.