在核心数据映射模型的值表达式中使用“indexOfObject:”
Posted
技术标签:
【中文标题】在核心数据映射模型的值表达式中使用“indexOfObject:”【英文标题】:Using "indexOfObject:" in value expression for Core Data mapping model 【发布时间】:2013-04-06 19:53:29 【问题描述】:我需要迁移我的核心数据模型以将有序关系替换为普通关系以支持 iCloud。我创建了一个映射模型并尝试通过添加新属性“索引”并使用“FUNCTION($source.project.tasks, "indexOfObject:" , $source)
”来获取旧索引来保持顺序。 ($source.project.tasks 应该是一个有序集。我的实体“Project”和“Tasks”之间的关系如下所示:tasks > project)不幸的是,这不起作用。应用在启动时崩溃 (EXC_BAD_ACCESS)。
我不确定这是否是正确的方法。有什么方法可以让我的方法奏效还是有更好的方法?
编辑: $source.project.tasks 返回错误错误信息:
Relationship 'tasks' fault on managed object (0x1019f9130)
我创建了一个 NSManagedObject 类别,使用方法“indexOfTask:”来记录对象。
【问题讨论】:
【参考方案1】:我找到了解决办法:FUNCTION(...)
使用的所有方法都需要返回一个id值,所以我为NSManagedObject创建了一个类别并添加了这个方法:
- (NSNumber *)getIndexOfTask
NSUInteger index = [(NSOrderedSet *)[[(CTask *)self project] tasks] indexOfObject:self];
if (index == NSNotFound)
return @0;
else
return [NSNumber numberWithInteger:index];
此方法将索引返回为 NSNumber,FUNCTION(...)
可以使用:
FUNCTION($source, "getIndexOfTask").intValue
【讨论】:
【参考方案2】:第一个想法:尝试使用其他名称(不是index
)。好像有特殊的意义。 sequence
呢?
第二个想法:进行两步迁移。
在中间步骤中,您只需添加索引。您遍历所有有序集并设置索引并保存。然后您进行第二次迁移,完全消除有序集。
(应该有一个多存储策略,您可以使用它来确保安全,并在出现问题时返回旧数据或临时数据。)
【讨论】:
更改名称没有帮助。我还发现,“.project.tasks”返回错误。我不知道为什么会这样,但我相信如果解决了这个问题,我的方法会奏效。以上是关于在核心数据映射模型的值表达式中使用“indexOfObject:”的主要内容,如果未能解决你的问题,请参考以下文章