核心数据 valueForKeyPath 返回 0
Posted
技术标签:
【中文标题】核心数据 valueForKeyPath 返回 0【英文标题】:Core Data valueForKeyPath returns 0 【发布时间】:2011-12-03 20:09:09 【问题描述】:我有一个核心数据项目,其中包含一种“主”实体,它包含一个年份值(int 16)和一些其他值。还有一些其他“子”实体与这个主实体具有多对一关系。在其中一个实体中,我想设置几个默认值,即开始日期和结束日期。默认值应该是分配给主实体的年初和年末。所以我用了这个:
- (void) awakeFromInsert
int currentYear = [[self valueForKeyPath: @"master.year"] intValue];
NSString *currentYearStart = [NSString stringWithFormat: @"%d-01-01 00:00:01 +0000", currentYear];
NSString *currentYearEnd = [NSString stringWithFormat: @"%d-12-31 23:59:59 +0000", currentYear];
[self setStartDate: [NSDate dateWithString: currentYearStart]];
[self setEndDate: [NSDate dateWithString: currentYearEnd]];
当我运行它时,即使 master 的“year”属性的值为 2011,currentYear 总是最终为 0。我尝试设置“int currentYear = 2011”,然后代码按预期工作,所以问题出在似乎在第一行。奇怪的是,在主实体的 NSManagedObject 子类中,我有这样的行:
float total = [[self valueForKeyPath: @"child.@sum.amount"] floatValue];
这总是返回正确的数量。我看不出有什么区别。其他人可以吗?
【问题讨论】:
【参考方案1】:您确定在调用您的方法时设置了 master 吗?此外,awakeFromInsert 文档表明您必须先致电 [super awakeFromInsert]
。
【讨论】:
调用 [super awakeFromInsert] 似乎没有任何改变。另外,子对象是通过点击按钮来添加和删除的,添加和删除按钮绑定到的NSArrayController的内容设置为master.selection.child,所以调用awakeFromInsert时master必须存在。 你确定吗?如果您在那里登录[self valueForKeyPath:@"master"]
会发生什么? [self valueForKeyPath:@"master.year"]
呢?
嗯,你可能是对的,但我还是不明白。日志给了我 2011-12-03 18:00:24.860 MyProg[1565:707] master = (null) 2011-12-03 18:00:26.024 MyProg[1565:707] master.year = (null) 但是添加按钮绑定到子数组控制器的“canAdd”,就像我说的,数组控制器绑定到master.selection.child。所以“canAdd”在master有选择之前不是真的,这意味着master.year在那个时候存在......我很困惑。
问题是新对象的插入发生在其主属性设置之前。 (插入是托管对象发生的第一件事,在设置任何属性之前。)您可能希望继承数组控制器并覆盖 - newObject
以在该点设置默认日期。 (即调用[super newObject]
,然后在返回的对象上设置默认日期。)
我明白了 - master 存在,但关系还没有“插入”。好吧,我创建了一个新类 ChildController:NSArrayController,将其设置为 nib 中的 Child Controller 的类,覆盖 -newObject
,称为 (id) object = [super newObject]
,然后使用类似上面的代码,将 self
替换为 object
。由于某种原因,甚至没有调用该函数。我认为这可能是因为 Core Data 处理对象而不是数组控制器,所以我覆盖了-add:(id) sender
,但它仍然没有被调用...以上是关于核心数据 valueForKeyPath 返回 0的主要内容,如果未能解决你的问题,请参考以下文章
swift 笔记:iOS与JavaScript的交互(二):JavaScriptCore:15。使用valueForKeyPath来返回一个上下文
希望从“valueForKeyPath”中清除“任何”值的这个 switch 语句