代码之家  ›  专栏  ›  技术社区  ›  Coocoo4Cocoa

为什么核心数据创建具有属性但没有附带实例变量的nsmanagedObject?

  •  2
  • Coocoo4Cocoa  · 技术社区  · 16 年前

    正如标题所说,为什么核心数据会创建NSManagedObject实例,并为每个实体的属性提供属性,但没有附带的实例变量?问题是,我希望在我的代码的某些部分中使用一些典型的alloc/init样式的“实体”。不使用核心数据的提取/上下文来创建/存储。

    我想我可以不使用实例变量,但是添加它们会有什么影响吗?我还可以将@dynamic更改为@synthesis以便在属性/ivars上使用kvc吗?

    在代码的某些部分尝试使用我的一个核心数据实体而不使用核心数据API,这可能是完全错误的。我还不太明白什么时候能走自己的路。

    2 回复  |  直到 16 年前
        1
  •  16
  •   Louis Gerbarg    16 年前

    它不使用IVARS的原因是数据不在那里。当您加载一个对象时,它可能不会在其所有数据中出错。如果NSManagedObject还没有加载,它就没有机会出错,那么ivar只是变量。via访问器nsmanagedObject有一个阻塞点,允许它在尚未出现故障的情况下从磁盘读取数据,这意味着对象图可以被延迟地引入。否则,您将需要引入每个连接的对象。

    因此,您不能只添加ivar,它们将没有您想要的值。同样,您不能从@dynamic更改为@synthesized,事情将无法正常运行。coredata提供的动态属性实现完全符合kvc和kvo。

    如果您想访问这些值而不触发kvo或kvc,您可以访问“原始”值。你可以用两种方法中的一种来做。您可以使用primitiveValueForkey:和setPrimitive:ValueForkey:或者您只需声明该原语并让CD提供动态实现(从 documentation )

    @interface Department : NSManagedObject
    {
    }
    @property(nonatomic, retain) NSString *name;
    @end
    
    @interface Department (PrimitiveAccessors)
    - (NSString *)primitiveName;
    - (void)setPrimitiveName:(NSString *)newName;
    @end
    
        2
  •  3
  •   Peter Hosey    16 年前

    您不需要具有核心数据的实例变量。托管对象将这些值存储在其他地方。

    我对核心数据的了解从来没有太多,但是如果我记得正确的话,你应该使用 primitiveValueForKey: setPrimitiveValue:forKey: 从访问器方法执行这些访问。(在访问器之外,您应该使用访问器本身或 valueForKey: / setValue:forKey: 取而代之的是)

    推荐文章