使用映射模型在核心数据对象模型之间迁移
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
的子类吗?你如何指定你的映射模型来使用这个子类?谢谢!以上是关于使用映射模型在核心数据对象模型之间迁移的主要内容,如果未能解决你的问题,请参考以下文章