您可以做的一件事是创建一个自定义迁移策略类,该类具有将您的属性从原始值映射到新值的功能。例如,我有一个案例,我需要将名为MyItems的实体与一组名为“Items”的值实体直接关联,以代替存储itemID,以便将模型分割到多个商店。
旧的模式是这样的:
新的模式是这样的:
要做到这一点,我写了一个名为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)。
这是我最后做 – 2011-03-22 04:28:08
谢谢你这个答案!你简短的例子为我节省了很多时间和挫折。 (它会在一段时间内杀死Apple,在其文档中包含这样的内容吗?) – quickthyme 2011-07-30 19:53:38
@gregc首先,感谢我在其他地方找不到的有趣方法。这正是我需要的。但不幸的是,我无法得到它的工作。看起来我的自定义迁移策略类中的方法未被调用。在生成的DB中,应由这些方法返回的值填充的字段为空。而且,我在这些未触发的方法中设置断点。有什么可以做错的?你知道调试迁移过程的任何方式(或者至少确保它的执行)吗?谢谢! – 2013-03-28 15:55:29