0

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

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

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

如果我创建了一个新的映射模型,那么事情通常会起作用 - 除了没有创建新的样本,运行和样本之间以及样本和数据之间没有建立任何关系。

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

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

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

按照此示例,我将运行属性设置为

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

同样,我将 RunToRun 中的“示例”属性映射设置为

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

和 DataToData 中的“样本”属性

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

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

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

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

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

4

1 回答 1

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];
        }
    }
于 2010-10-15T17:08:03.417 回答