NSManagedObject 子类 (CoreData) 中数字的 KVC 合规性

Posted

技术标签:

【中文标题】NSManagedObject 子类 (CoreData) 中数字的 KVC 合规性【英文标题】:KVC compliance for numbers in NSManagedObject subclass (CoreData) 【发布时间】:2009-03-20 20:50:06 【问题描述】:

我正在尝试对 NSManagedObject 子类进行排序的基本测试。我设置了一个基本的子类“TestClass”,它有两个属性:stringFieldnumberField。他们使用标准的 Obj-C 2.0 访问器协议:

@interface TestClass : NSManagedObject
@property (retain) NSString *stringField;
@property (retain) NSNumber *numberField;
@end

@implementation TestClass
@dynamic stringField;
@dynamic numberField;
@end

当我尝试获取该实体的实例时,我可以根据任一属性进行获取。但是,如果我使用排序描述符,则称 numberField 不符合 KVC。

在模型中,我将numberField 设置为 Int64,但我很困惑。我认为包装器(NSNumber)会处理 KVC 问题。我需要做什么才能完成这项工作?

【问题讨论】:

【参考方案1】:

一些初始的“计算机开机了吗?”类型的问题:

    您的模型是否指定实体的托管对象类是 TestClass? 在排序描述符中指定键时,您确定numberField 拼写正确吗? numberField 是模型中的瞬态属性吗?

这些是我能想到的常见问题,在使用排序描述符获取时可能会导致此类错误,尤其是第一个。

此外,这不会影响 KVC,但您的属性的属性声明应该是 (copy) 而不是 (retain),因为它们是符合 NSCopying 协议的“值”类,并且可能具有可变子类。您不想传入一个可变字符串并在 Core Data 下对其进行变异。 (是的,Cocoa 中没有 NSMutableNumber 或 NSMutableDate,但这并不妨碍创建 MyMutableNumber 或 MyMutableDate 子类...)

【讨论】:

是的,它确实指定 MO 类是 TestClass。不,不是暂时的。错误是#2。拼写错误(numberKey 而不是 numberfield)。多么愚蠢。谢谢!还注意到了副本。谢谢。 (copy) 是正确的属性,除了在 NSManagedObject 子类中,“Core Data 生成的属性访问器方法是默认的(非原子的,保留)——这是推荐的配置。”和“您应该谨慎使用副本,因为它会增加开销。” [来源:Apple's Core Data Programming Guide >> Managed Object Accessor Methods]

以上是关于NSManagedObject 子类 (CoreData) 中数字的 KVC 合规性的主要内容,如果未能解决你的问题,请参考以下文章

当一对多相关的 NSManagedObject 子类发生更改时,如何更新 NSManagedObject 子类?

NSManagedObject 验证和子类

新的 NSManagedObject 子类与新的 NSObject 子类?

NSManagedObject 子类属性

子类化一个 NSManagedObject 子类

NSManagedObject 子类模拟