核心数据无法生成原始访问者

时间:2010-12-19 05:41:37

标签: cocoa core-data properties dynamically-generated

根据我对Core Data的理解,原始访问器工作所需的一切是属性名称的@dynamic指令(以及在实体实现中声明该属性的原始访问器)。

出于某种原因,当使用生成的原语访问器时,setState:方法修改state属性:

- (int)state 
{
    NSNumber * tmpValue;

    [self willAccessValueForKey:@"state"];
    tmpValue = [self primitiveState];
    [self didAccessValueForKey:@"state"];

    return [tmpValue intValue];
}

- (void)setState:(int)value 
{
    [self willChangeValueForKey:@"state"];
    [self setPrimitiveState:[NSNumber numberWithInt:value]];
    [self didChangeValueForKey:@"state"];
}

使用键值编码版修改状态属性

- (int)state 
{
    NSNumber * tmpValue;

    [self willAccessValueForKey:@"state"];
    tmpValue = [self primitiveValueForKey:@"state"];
    [self didAccessValueForKey:@"state"];

    return [tmpValue intValue];
}

- (void)setState:(int)value 
{
    [self willChangeValueForKey:@"state"];
    [self setPrimitiveValue:[NSNumber numberWithInt:value] forKey:@"state"];
    [self didChangeValueForKey:@"state"];
}

在这两种情况下,我都将原始访问器声明如下(并根据Apple的示例和代码生成):

@interface Post (CoreDataGeneratedPrimitiveAccessors)

- (NSNumber *)primitiveState;
- (void)setPrimitiveState:(NSNumber *)value;

@end

我有点不知道为什么会这样。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:3)

经过大量的头脑搔痒,调试,摆弄和猜测,我终于找到了问题所在:如果将这些属性定义为实例变量,则不会动态生成Core Data原始访问器。我已将它们定义为用于调试目的(因为GBD无法在没有定义的ivars的情况下看到属性的值),这样就无法正确生成原始访问器。这是Apple应该以某种形式真正记录的内容。因为很难自己发现。我希望这可以帮助那些遇到同样问题的人!

答案 1 :(得分:1)

我一直在研究这个问题,其中一个发现的事情是,与文档相反,从数据模型生成的实现文件不会列出原始动态访问器。其他地方声明你必须自己添加它们。这可能是问题吗?

答案 2 :(得分:0)

您是否正在使用/修改Xcode生成的NSManagedObject代码?我相信默认情况下这些是由#if 0指令“注释”生成的。

答案 3 :(得分:0)

只是想说我遇到了同样的问题,不得不根据你的评论切换到setPrimitiveValue和primitiveValueForKey。令我困扰的是默认实现不起作用。在我的例子中,值得注意的是我是另一个NSManagedObject的子类。不确定这是否也是你的情况。