在Core Data映射模型的值表达式中使用“indexOfObject:”

时间:2013-04-06 19:53:29

标签: objective-c macos core-data icloud core-data-migration

我需要迁移我的核心数据模型来替换正常的有序关系以支持iCloud。我已经创建了一个映射模型,并尝试通过添加新属性“index”并使用“ FUNCTION($source.project.tasks, "indexOfObject:" , $source) ”来维护订单,以获取旧索引。 ($ source.project.tasks应该是一个有序集。我的实体“Project”和“Tasks”之间的关系如下所示:tasks< - >> project)不幸的是,这不起作用。应用程序在启动时崩溃(EXC_BAD_ACCESS)。

我不确定这是不是正确的方法。有没有办法让我的方法有效?还是有更好的方法?

Mapping Model

编辑: $ source.project.tasks返回错误错误消息: Relationship 'tasks' fault on managed object (0x1019f9130)

我使用方法“indexOfTask:”创建了一个NSManagedObject类别来记录对象。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

第一个想法:尝试使用其他名称(不是index)。它看起来有特殊意义。 sequence怎么样?

第二个想法:执行两步迁移。

在临时步骤中,您只需添加索引。您遍历所有有序集并设置索引并保存。然后你进行第二次迁移,完全取消有序集。

应该有一个多商店策略,您可以使用它来保证安全,并在出现问题时返回旧版或临时数据。