在核心数据映射模型的值表达式中使用“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:”的主要内容,如果未能解决你的问题,请参考以下文章

映射核心数据模型属性类型

iOS 核心数据映射模型

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

核心数据迁移 - 找不到迁移的映射模型

核心数据版本控制 - 需要多个映射模型

核心数据测试迁移映射模型