代码之家  ›  专栏  ›  技术社区  ›  westsider

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

  •  0
  • westsider  · 技术社区  · 14 年前

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

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

    因此,请运行<-->>示例和示例<-->数据。(为了简单起见,我暂时将run<-->数据保留在适当的位置。)

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

    我正在尝试使用映射模型来迁移我的模型,但是即使对生成的映射模型做了微小的更改,也会导致COCOA错误134110。

    例如,如果我取“sample”映射(没有源代码)并将其源代码设置为“run”(以便我可以适当地设置示例的反向关系“run”),则映射会将其名称更改为“run to sample”。此映射中处理了两个关系:数据和运行。数据属性自动设置为

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

    在这个例子之后,我将run属性设置为

    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 回复  |  直到 14 年前
        1
  •  1
  •   westsider    14 年前

    通过下面的内容,我能够更好地了解发生了什么(以及出了什么问题):

            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];
            }
        }
    
    推荐文章