7

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

最后,我有一组另一个实体“卡片”,其中一组可以与卡片组相关联,并且在每个实体中,如果卡片组是“图像”类型之前。

使用我在两个版本之间创建的映射模型中的值表达式,这一切都可能吗,还是我必须做其他事情?

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

4

1 回答 1

27

您可以做的一件事是创建一个自定义迁移策略类,该类具有将您的属性从原始值映射到新值的函数。例如,我需要映射一个名为 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)。

**注意这应该匹配方法的选择器签名

映射模型

于 2011-03-22T00:41:14.580 回答