我正在尝试为Core Data实体编写一个简单的表视图编辑器。不幸的是我遇到了问题。
将第一个实体添加到表时会发生错误。启动模态对话框的过程如下:
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];
我第一次创建一个对象(当列表为空时)我得到了这个:
在Core Data更改处理期间捕获到异常:[valueForUndefinedKey:]:实体Group不是键值“(null)”的键值编码兼容。
如果我在打开对话框之前填写'name'字段,我可以成功添加第一个实体:
[newManagedObject setValue:@“New Group”forKey:@“name”]; //这个有用吗
我正在使用NSFetchedResultsController
管理表格视图BTW。
谢谢!
答案 0 :(得分:0)
在您的第一个代码块中,第三行代码似乎脱离了上下文。不确定那里是否有可能有所贡献的东西。
其次,从实体名称将NSManagedObject转换为NSManagedObjectContext的最简单方法是使用[NSEntityDescription insertNewObjectForEntityName:inManagedObjectContext:]选择器。
所以,我会做类似的事情:
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityName:@"Group" inManagedObjectContext:context];
您不再需要释放newObject,因为[NSEntityDescription insertNewObjectForEntityName:inManagedObjectContext:]选择器将返回一个保留计数为0的对象。另外,请确保您具有NameEditController,将其managedObject属性指定为保留。 / p>
为了解决您的实际问题,听起来您可能已将“名称”指定为数据模型中的必需属性?显示数据模型中“名称”详细信息的屏幕截图会有所帮助。
答案 1 :(得分:0)
Yarr ...对不起伙计们,实际上我的didChangeObject:atIndexPath:forChangeType:newIndexPath:
函数已经从其他地方匆匆复制了。显然,此处抛出的异常可能会在save:
方法中隐藏。