实体 xxx 不符合键“(null)”的键值编码

Posted

技术标签:

【中文标题】实体 xxx 不符合键“(null)”的键值编码【英文标题】:The entity xxx is not key value coding-compliant for the key "(null)" 【发布时间】:2009-12-03 22:12:50 【问题描述】:

我正在尝试为核心数据实体编写一个简单的表格视图编辑器。不幸的是,我遇到了问题。

将第一个实体添加到表时发生错误。调出模态对话框的过程如下:

NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Group" inManagedObjectContext:context];
    insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
NSManagedObject *newManagedObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:context];

NameEditController *dialog = [[NameEditController alloc] init];
dialog.managedObject = newManagedObject;
[newManagedObject release];

UINavigationController *navCtrlr = [[UINavigationController alloc] initWithRootViewController:dialog];
navCtrlr.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[[self navigationController] presentModalViewController: navCtrlr animated:YES];    
[navCtrlr release];

NameEditController 中,按下完成按钮后我有这个:

NSString* name = self.nameLabel.text;
[self.managedObject setValue:name forKey:@"name"];

NSError *error = nil;
if (![managedObject.managedObjectContext save:&error]) 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

UIViewController *ctrl = [self parentViewController];
[ctrl dismissModalViewControllerAnimated:YES];

我第一次创建一个对象(当列表为空时)我得到这个:

在核心数据更改处理期间捕获到异常:[valueForUndefinedKey:]:实体组不符合键“(null)”的键值编码。

如果我在弹出对话框之前填写“名称”字段,我可以成功添加第一个实体:

[newManagedObject setValue:@"New Group" forKey:@"name"]; // 这行得通

我正在使用NSFetchedResultsController 来管理表视图顺便说一句。

谢谢!

【问题讨论】:

[error userInfo] 会产生什么? TechZen,这是控制台上的输出:userInfo NSTargetObjectUserInfoKey = (entity: Group; id: 0x46db950 ; 数据: 成员 = ( ); 名称 = dd; ); NSUnknownUserInfoKey = ; 实体只有两个属性,名称(字符串)和成员(一对多关系) 【参考方案1】:

在您的第一个代码块中,第三行代码似乎脱离了上下文。不确定那里是否有什么可以贡献的。

其次,将 NSManagedObject 从实体名称转换为 NSManagedObjectContext 的最简单方法是使用 [NSEntityDescription insertNewObjectForEntityName:inManagedObjectContext:] 选择器。

所以,我会这样做:

NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityName:@"Group" inManagedObjectContext:context];

您不再需要释放 newObject,因为 [NSEntityDescription insertNewObjectForEntityName:inManagedObjectContext:] 选择器将返回一个保留计数为 0 的对象。此外,请确保您有 NameEditController 将其 managedObject 属性指定为保留。

为了解决您的实际问题,听起来您可能在数据模型中将“名称”指定为必需属性?显示数据模型中“名称”详细信息的屏幕截图会有所帮助。

【讨论】:

【参考方案2】:

Yarr...对不起,实际上是在我的didChangeObject:atIndexPath:forChangeType:newIndexPath: 函数中匆忙从别处复制而来的。显然,这里抛出的异常可能会在 save: 方法中被掩盖。

【讨论】:

(也 .. NSZombieEnabled 很好 .. developer.apple.com/mac/library/technotes/tn2004/tn2124.html

以上是关于实体 xxx 不符合键“(null)”的键值编码的主要内容,如果未能解决你的问题,请参考以下文章

Restkit - 实体(空)不符合键“行”的键值编码

即使在重新启动我的开发 Mac 之后,实体仍然不符合键的键值编码

Core Data 此类不符合键名的键值编码

iOS 崩溃:“此类不符合键 url 的键值编码”

iOS 此类不符合键标签的键值编码

此类不符合键的键值编码