Основная миграция данных: выражение значения сопоставления атрибутов - PullRequest
4 голосов
/ 20 марта 2011

В настоящее время у меня есть атрибут cardType для моей сущности, который в старой модели мог быть "Math", "Image" или "Text". В новой модели я буду использовать только «Math» и «Text», а также иметь атрибут hasImage, который я хочу установить в значение true, если в качестве старого cardType был Image (который я хочу изменить на «Text»).

Наконец, у меня есть набор другой сущности, "карта", набор которой может быть связан с колодой, и в каждой из них у меня также будет hasImage, который я хочу установить в true, если колода раньше был типа «Имидж».

Возможно ли все это с помощью выражения значения в модели сопоставления, которую я создал между двумя версиями, или мне придется сделать что-то еще?

Я не могу найти ни одного документа, рассказывающего мне точно, что возможно в выражении значения (документ Apple - http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/vmMappingOverview.html%23//apple_ref/doc/uid/TP40004735-SW3 - имеет только очень простое преобразование). Если я должен сделать что-то еще, что бы это было? Это кажется достаточно простым, чтобы выражение могло это сделать.

1 Ответ

24 голосов
/ 22 марта 2011

Одна вещь, которую вы можете сделать, - это создать собственный класс политики миграции, в котором есть функция, отображающая ваш атрибут из исходного значения в новое значение.Например, у меня был случай, когда мне нужно было сопоставить сущность MyItems, которая имела прямое отношение к набору сущностей значений, называемых «Предметы», чтобы вместо этого сохранить itemID, чтобы я мог разделить модель по нескольким хранилищам.

Старая модель выглядела так: old model

Новая модель выглядела так: new model

Для этого я написал класс отображения с функцией itemIDForItemName, и это былоопределяется следующим образом:

@interface Migration_Policy_v1tov2 : NSEntityMigrationPolicy {

  NSMutableDictionary *namesToIDs;
}

- (NSNumber *) itemIDForItemName:(NSString *)name;
@end

# import "Migration_Policy_v1tov2.h"

@implementation Migration_Policy_v1tov2


    - (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error {

        namesToIDs = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1],@"Apples",
                      [NSNumber numberWithInt:2],@"Bananas",
                      [NSNumber numberWithInt:3],@"Peaches",
                      [NSNumber numberWithInt:4],@"Pears",
                      [NSNumber numberWithInt:5],@"Beef",
                      [NSNumber numberWithInt:6],@"Chicken",
                      [NSNumber numberWithInt:7],@"Fish",
                      [NSNumber numberWithInt:8],@"Asparagus",
                      [NSNumber numberWithInt:9],@"Potato",
                      [NSNumber numberWithInt:10],@"Carrot",nil];
        return YES;
    }
    - (NSNumber *) itemIDForItemName:(NSString *)name {

        NSNumber *iD = [namesToIDs objectForKey:name];

        NSAssert(iD != nil,@"Error finding ID for item name:%@",name);

        return iD;
    }
    @end

Затем для связанного имени сопоставления для атрибута в модели сопоставления вы задаете выражение значенияв результате вызова вашей функции как таковой: FUNCTION ($ entityPolicy, "itemIDForItemName", $ source.name).Вам также необходимо установить в поле «Пользовательская политика» вашего имени сопоставления для этого атрибута имя класса сопоставления (в данном случае Migration_Policy_v1toV2).

Mapping Model

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...