核心数据:迁移具有自引用属性的实体

Posted

技术标签:

【中文标题】核心数据:迁移具有自引用属性的实体【英文标题】:Core Data: migrating entities with self-referential properties 【发布时间】:2009-10-30 17:56:14 【问题描述】:

我的核心数据模型包含一个实体 Shape,它有两个自引用关系,这意味着四个属性。一对是一对多关系(Shape.containedBy > Shape.contains),另一对是多对多关系(Shape.nextShapes > Shape.previousShapes)。这一切都在应用程序中完美运行,所以我不认为自引用关系通常是一个问题。

但是,在将模型迁移到新版本时,Xcode 无法编译自动生成的映射模型,并显示以下错误消息:

2009-10-30 17:10:09.387 mapc[18619:607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "FUNCTION($manager ,'destinationInstancesForSourceRelationshipNamed:sourceInstances:' , 'contains' , $source.contains) == 1"'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00007fff80d735a4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x00007fff83f0a313 objc_exception_throw + 45
    2   Foundation                          0x00007fff819bc8d4 _qfqp2_performParsing + 8412
    3   Foundation                          0x00007fff819ba79d +[NSPredicate predicateWithFormat:arguments:] + 59
    4   Foundation                          0x00007fff81a482ef +[NSExpression expressionWithFormat:arguments:] + 68
    5   Foundation                          0x00007fff81a48843 +[NSExpression expressionWithFormat:] + 155
    6   XDBase                              0x0000000100038e94 -[XDDevRelationshipMapping valueExpressionAsString] + 260
    7   XDBase                              0x000000010003ae5c -[XDMappingCompilerSupport generateCompileResultForMappingModel:] + 2828
    8   XDBase                              0x000000010003b135 -[XDMappingCompilerSupport compileSourcePath:options:] + 309
    9   mapc                                0x0000000100001a1c 0x0 + 4294973980
    10  mapc                                0x0000000100001794 0x0 + 4294973332
)
terminate called after throwing an instance of 'NSException'
Command /Developer/usr/bin/mapc failed with exit code 6

“包含”是自引用属性之一的名称。无论如何,真正的大问题是我什至无法查看此映射属性,因为在查看映射模型时,一旦我选择实体映射,Xcode 就会崩溃。所以我有点迷失从这里去哪里。我真的无法删除自引用属性,所以我想我已经手动创建了一个可以编译的映射模型?有什么想法吗?

干杯

【问题讨论】:

当您说“将模型迁移到新版本”时,是指应用程序、Xcode、OS 的新版本吗? 我相信他正在尝试创建到新 CoreData 模型架构的自动迁移映射——在创建他的应用程序的较新版本时,他更改了架构,并希望让较新的应用程序迁移旧数据到新模式。我想。 是的,完全正确。我已经更新了我的核心数据架构,我不想丢失我的数据存储的内容,所以我需要将当前的数据存储迁移到我的架构的新版本。我开始认为这实际上是Xcode中的一个错误,特别是在解码/编译具有自反关系的模型映射文件时,会产生某种无限循环......我要问可可开发,如果我在那里得到回复,我会在这里发帖。 【参考方案1】:

好的,看起来“包含”可能是一个保留字,因此需要使用“#”进行转义。 The Apple docs on migration 没有特别提到它作为保留字,尽管他们也没有说明最终列表是什么。

但是,属性名称似乎不能与任何 NSObject 或 NSManagedObject 方法名称相同,例如“描述”,并且显然是“包含”。

【讨论】:

以上是关于核心数据:迁移具有自引用属性的实体的主要内容,如果未能解决你的问题,请参考以下文章

如何从Core Data中的字符串获取Processed字符串

涉及新实体和一对多关系的核心数据迁移

多对多的核心数据迁移

更改某些实体中某些属性的类型后如何迁移核心数据模型?

核心数据模型迁移步骤

核心数据迁移删除实体数据