NSManagedObject 键存在于实体描述中,但在尝试访问它时,应用程序崩溃并显示"this class is not key value coding-compliant"



我有一个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标记为可选。对于您正在访问的实体,它是否存在?如果您关闭可选并给它一个默认值,会发生什么?

相关内容

  • 没有找到相关文章

最新更新