使用映射模型在核心数据对象模型之间迁移

Posted

技术标签:

【中文标题】使用映射模型在核心数据对象模型之间迁移【英文标题】:Using Mapping Models to migrate between Core Data Object Models 【发布时间】:2010-05-22 00:47:40 【问题描述】:

我有一个相当简单的架构。本质上,运行 数据(其中运行保存数据,例如温度,从某种传感器采样)。

现在,传感器似乎可以进行不止一种测量(例如温度和湿度)。因此,一次 Run 可能有多个数据样本。

因此,运行 > 样本和样本 数据。 (为了简单起见,我暂时将 Run Data 留在原处。)

如果我创建一个新的映射模型,那么一切正常 - 除了没有创建新的样本,运行和样本之间也没有建立样本和数据之间的关系。

我正在尝试使用映射模型来迁移我的模型,但即使对生成的映射模型进行最轻微的更改也会导致 Cocoa 错误 134110。

例如,如果我采用“Sample”映射(没有 Source)并将其 Source 设置为“Run”(以便我可以适当地设置 Sample 的反向关系“run”),则映射将其名称更改为“ RunToSample”。此映射中处理了两种关系:数据和运行。 data 属性自动设置为

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "DataToData", $source.dataSet)

按照这个例子,我将运行属性设置为

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "RunToRun", $source)

同样,我将 RunToRun 中的 'sample' 属性映射设置为

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "RunToSample", $source)

和DataToData中的'sample'属性到

FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:" , "RunToSample", $source.run)

那么,我想知道,哪里出了问题?我尝试了各种排列,例如未指定“反向”关系。但无论如何,我都会继续收到相同的错误 (134110)。

我想这比看起来要容易得多,而且我缺少一些基本但次要的部分。我也尝试过继承 NSEntityMigrationPolicy 并覆盖 -createDestinationInstancesForSourceInstance: 但这些努力得到了大致相同的结果。

提前感谢任何指针或(相关:-)建议。

编辑:为简单起见,我已将所有关系标记为可选。不过,最终我可能会选择其他方式。

【问题讨论】:

【参考方案1】:

使用以下内容,我能够更好地了解发生了什么(以及出错):

        NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyDataStore.sqlite"]];

    NSError *error = nil;
    NSDictionary *sourceMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                    URL:storeUrl
                                                                    error:&error];

    if (!sourceMetadata)
        
        DLog(@"sourceMetadata is nil");
        
    else
        
        DLog(@"sourceMetadata is %@", sourceMetadata);
        

此外,我需要仔细整理我的实体映射。而且,我发现 -[NSMigrationManager destinationInstancesForEntityMappingNamed:sourceInstances:] 对于复制“关系”是绝对必要的。例如,

    NSSet *runs = [source valueForKey:@"allRuns"];
for (Run *srcRun in runs)
    
    NSArray *temp = [manager destinationInstancesForEntityMappingNamed:@"RunToRun"
                                sourceInstances:[NSArray arrayWithObject:srcRun]];
    if ([temp count])
        
        Run *dstRun = (Run*)[temp lastObject];
        [dest addAllRunsObject:dstRun];
        
    

【讨论】:

嗨!我正在学习如何迁移。第二个代码块(在您的答案中)属于哪个类?你是NS...something 的子类吗?你如何指定你的映射模型来使用这个子类?谢谢!

以上是关于使用映射模型在核心数据对象模型之间迁移的主要内容,如果未能解决你的问题,请参考以下文章

不同模型之间的核心数据迁移?

核心数据迁移问题:“持久存储迁移失败,缺少源托管对象模型。”

核心数据版本控制 - 需要多个映射模型

核心数据迁移 - 找不到迁移的映射模型

没有找到适合核心数据迁移的映射模型

核心数据模型迁移