NSManagedObject 子类 (CoreData) 中数字的 KVC 合规性
Posted
技术标签:
【中文标题】NSManagedObject 子类 (CoreData) 中数字的 KVC 合规性【英文标题】:KVC compliance for numbers in NSManagedObject subclass (CoreData) 【发布时间】:2009-03-20 20:50:06 【问题描述】:我正在尝试对 NSManagedObject 子类进行排序的基本测试。我设置了一个基本的子类“TestClass”,它有两个属性:stringField
和numberField
。他们使用标准的 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 子类?