我目前在我的实体上有一个cardType属性,在旧模型中可以是“Math”,“Image”或“Text”。在新模型中,我将仅使用“Math”和“Text”并且还具有hasImage属性,如果旧的cardType是Image(我想要更改为“Text”),我想将其设置为true。
最后,我有一套另一个实体,“卡片”,其中一个套装可以与一个套牌相关联,在每个实体中,我也会有一个我想要设置为真的hasImage以前是“图像”类型。
这是否可以使用我在两个版本之间创建的映射模型中的值表达式,还是我必须做其他事情?
我找不到任何文件告诉我价值表达中究竟有什么可能(Apple的文档 - http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/vmMappingOverview.html%23//apple_ref/doc/uid/TP40004735-SW3 - 只有一个非常简单的转换)。如果我必须做别的事,会是什么?这看起来很简单,表达式应该可以做到。
答案 0 :(得分:24)
您可以做的一件事是创建一个自定义迁移策略类,该类具有将您的属性从原始值映射到新值的函数。例如,我有一个案例,我需要映射一个名为MyItems的实体,该实体与一组名为“Items”的值实体有直接关系,而不是存储itemID,因此我可以将模型拆分为多个商店。
旧模型看起来像这样:
新模型如下所示:
为此,我使用名为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)。