我有一个NSManangedObject,它在实体描述中显示所有正确的属性。但每当我试图访问其中一个属性时,它就会崩溃,说它不符合键值编码。
我已经三次检查了我的数据模型和实体类,一切看起来都是正确的。
我不确定这是否有什么不同,但我正在通过通知访问对象。这里有一个例子:
NSDictionary *dict = notification.userInfo;
NSSet *set = [dict objectForKey:NSInsertedObjectsKey];
for (NSManagedObject* managedObject in set) {
NSLog(@"%@", managedObject.entity.attributesByName);
if([managedObject.entity.attributesByName valueForKey:@"defaultid"] != nil) {
NSLog(@"defaultid: %@", [managedObject valueForKey:@"defaultid"]);
}
}
将输出:
{
defaultid = "(<NSAttributeDescription: 0x175c90>), name defaultid, isOptional 1, isTransient 0, entity MyEntity, renamingIdentifier defaultid, validation predicates (n), warnings (n), versionHashModifier (null)n userInfo {n}, attributeType 100 , attributeValueClassName NSNumber, defaultValue 0";
title = "(<NSAttributeDescription: 0x175ce0>), name title, isOptional 1, isTransient 0, entity MyEntity, renamingIdentifier title, validation predicates (n), warnings (n), versionHashModifier (null)n userInfo {n}, attributeType 700 , attributeValueClassName NSString, defaultValue (null)";
}
然后崩溃,出现以下情况:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<_NSObjectID_64_6 0x6119020> valueForUndefinedKey:]: this class is not key value coding-compliant for the key defaultid.'
如有任何见解,我们将不胜感激。
编辑:
通知来自调用此方法的iCloud:
- (void)mergeChangesFrom_iCloud:(NSNotification *)notification {
NSManagedObjectContext* moc = [self managedObjectContext];
[moc performBlock:^{
[self mergeiCloudChanges:notification forContext:moc];
}];
}
上面的代码在mergeiCloudChanges方法中。
编辑2(已解决):
所以事实证明我犯了一个愚蠢的错误。我以为[dict-objectForKey:NSInsertedObjectsKey]返回了一组managedObjects,但它所做的是返回一组managed ObjectID。
这项工作:
NSDictionary *dict = note.userInfo;
NSSet *set = [dict objectForKey:NSInsertedObjectsKey];
for (NSManagedObjectID* managedObjectID in set) {
NSManagedObject *newObject = [moc existingObjectWithID:managedObjectID error:nil];
}
感谢大家抽出时间。
根据我在实体描述中所看到的,您已经将defaultid标记为可选。对于您正在访问的实体,它是否存在?如果您关闭可选并给它一个默认值,会发生什么?