核心数据迁移:属性映射值expression式

我目前在我的实体上有一个cardType属性,在旧模型中可以是“math”,“图像”或“文本”。 在新模型中,我将只使用“math”和“文本”,并且还具有hasImage属性,如果旧的cardType是Image(我想要更改为“Text”),那么我想将其设置为true。

最后,我有一套另一个实体,“牌”,其中一套可以与一个套牌相关联,在每一个套牌中,如果套牌是“图像“types之前。

这是所有可能的使用在两个版本之间创build的映射模型中的值expression式,还是我将不得不做其他?

我无法find任何文档告诉我值expression式(Apple's doc – http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/vmMappingOverview.html% 23 // apple_ref / doc / uid / TP40004735-SW3 – 只有一个非常简单的转换)。 如果我必须做别的事,那会是什么? 这似乎很简单,expression式应该能够做到这一点。

你可以做的一件事就是创build一个自定义迁移策略类,它具有一个将你的属性从原始值映射到新值的function。 例如,我有一个情况,我需要映射一个名为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 

然后,为映射模型中属性的相关映射名称,可以将函数调用的结果指定为值expression式:FUNCTION($ entityPolicy,“itemIDForItemName”,$ source.name)。 您还必须将该属性的映射名称的自定义策略字段设置为映射类名称(在本例中为Migration_Policy_v1toV2)。

映射模型