2011-03-20 131 views
4

我目前在我的实体上有一个cardType属性,它在旧模型中可能是“数学”,“图像”或“文本”。在新模型中,我将只使用“数学”和“文本”,并且还有一个hasImage属性,如果旧的cardType是Image(我想要更改为“Text”),那么我想将其设置为true。核心数据迁移:属性映射值表达式

最后,我有一套另一个实体,“卡”,其中一套可以与一个套牌相关联,并在每一个,我也有hasImage,我想设置为true,如果甲板之前是“图像”类型。

这是所有可能的使用价值表达式在我创建的两个版本之间的映射模型,或者我将不得不做的其他?

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

回答

24

您可以做的一件事是创建一个自定义迁移策略类,该类具有将您的属性从原始值映射到新值的功能。例如,我有一个案例,我需要将名为MyItems的实体与一组名为“Items”的值实体直接关联,以代替存储itemID,以便将模型分割到多个商店。

旧的模式是这样的: old model

新的模式是这样的: new model

要做到这一点,我写了一个名为itemIDForItemName函数映射类,它被定义为这样的:

@interface Migration_Policy_v1tov2 : NSEntityMigrationPolicy { 

    NSMutableDictionary *namesToIDs; 
} 

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

#进口 “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

+0

这是我最后做 – 2011-03-22 04:28:08

+1

谢谢你这个答案!你简短的例子为我节省了很多时间和挫折。 (它会在一段时间内杀死Apple,在其文档中包含这样的内容吗?) – quickthyme 2011-07-30 19:53:38

+0

@gregc首先,感谢我在其他地方找不到的有趣方法。这正是我需要的。但不幸的是,我无法得到它的工作。看起来我的自定义迁移策略类中的方法未被调用。在生成的DB中,应由这些方法返回的值填充的字段为空。而且,我在这些未触发的方法中设置断点。有什么可以做错的?你知道调试迁移过程的任何方式(或者至少确保它的执行)吗?谢谢! – 2013-03-28 15:55:29