Ключ NSManagedObject существует в описании сущности, но при попытке доступа к нему происходит сбой приложения с «этот класс не совместим со значением кода» - PullRequest
0 голосов
/ 02 марта 2012

У меня есть NSManangedObject, который отображает все правильные атрибуты в описании сущности.Но всякий раз, когда я пытаюсь получить доступ к одному из атрибутов, он выходит из строя, говоря, что он не совместим с кодированием значения ключа.

Я трижды проверял свою модель данных и класс сущности, и все выглядит правильно.

IЯ не уверен, если это имеет значение, но я получаю доступ к объекту из уведомления.Вот пример:

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] возвратил набор управляемых объектов, но он возвращает набор управляемых идентификаторов.

Это работает:

NSDictionary *dict = note.userInfo;
NSSet *set = [dict objectForKey:NSInsertedObjectsKey];
for (NSManagedObjectID* managedObjectID in set) {
    NSManagedObject *newObject = [moc existingObjectWithID:managedObjectID error:nil];
}

Спасибо всем за уделенное время.

1 Ответ

1 голос
/ 02 марта 2012

Из того, что я могу сказать в описании сущности, вы по умолчанию помечены как необязательные.Существует ли она для сущности, к которой вы обращаетесь?Если вы отключите опционально и зададите ему значение по умолчанию, что произойдет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...