Ключ кодирования значения тайного ключа - PullRequest
0 голосов
/ 28 мая 2010

Я пытаюсь загрузить данные из недокументированного API (OsiriX).

Получение NSManagedObject следующим образом: NSManagedObject *itemStudy = [[BrowserController databaseOutline] itemAtRow: [[BrowserController databaseOutline] selectedRow]];

работает просто отлично.

Но получение NSManagedObject выглядит так: seriesArray = [_context executeFetchRequest:request error:&error]; NSManagedObject *itemSeries = [seriesArray objectAtIndex:0];

Создает ошибку, когда я звоню [itemSeries valueForKey:@"type"]

2010-05-27 11:04:48.178 rcOsirix[27712:7b03] Exception: [<NSManagedObject 0xd30fd0> valueForUndefinedKey:]: the entity Series is not key value coding-compliant for the key "type".

Это сильно смущает меня. Если я печатаю значения KVC для itemSeries, я получаю этот список:

2010-05-27 11:04:48.167 rcOsirix[27712:7b03] KVC comment
2010-05-27 11:04:48.168 rcOsirix[27712:7b03] KVC date
2010-05-27 11:04:48.168 rcOsirix[27712:7b03] KVC dateAdded
2010-05-27 11:04:48.169 rcOsirix[27712:7b03] KVC dateOpened
2010-05-27 11:04:48.169 rcOsirix[27712:7b03] KVC displayStyle
2010-05-27 11:04:48.170 rcOsirix[27712:7b03] KVC id
2010-05-27 11:04:48.170 rcOsirix[27712:7b03] KVC modality
2010-05-27 11:04:48.170 rcOsirix[27712:7b03] KVC name
2010-05-27 11:04:48.171 rcOsirix[27712:7b03] KVC numberOfImages
2010-05-27 11:04:48.171 rcOsirix[27712:7b03] KVC numberOfKeyImages
2010-05-27 11:04:48.171 rcOsirix[27712:7b03] KVC rotationAngle
2010-05-27 11:04:48.172 rcOsirix[27712:7b03] KVC scale
2010-05-27 11:04:48.172 rcOsirix[27712:7b03] KVC seriesDICOMUID
2010-05-27 11:04:48.173 rcOsirix[27712:7b03] KVC seriesDescription
2010-05-27 11:04:48.173 rcOsirix[27712:7b03] KVC seriesInstanceUID
2010-05-27 11:04:48.173 rcOsirix[27712:7b03] KVC seriesSOPClassUID
2010-05-27 11:04:48.174 rcOsirix[27712:7b03] KVC stateText
2010-05-27 11:04:48.174 rcOsirix[27712:7b03] KVC thumbnail
2010-05-27 11:04:48.174 rcOsirix[27712:7b03] KVC windowLevel
2010-05-27 11:04:48.175 rcOsirix[27712:7b03] KVC windowWidth
2010-05-27 11:04:48.175 rcOsirix[27712:7b03] KVC xFlipped
2010-05-27 11:04:48.176 rcOsirix[27712:7b03] KVC xOffset
2010-05-27 11:04:48.176 rcOsirix[27712:7b03] KVC yFlipped
2010-05-27 11:04:48.176 rcOsirix[27712:7b03] KVC yOffset
2010-05-27 11:04:48.177 rcOsirix[27712:7b03] KVC mountedVolume
2010-05-27 11:04:48.177 rcOsirix[27712:7b03] KVC study
2010-05-27 11:04:48.178 rcOsirix[27712:7b03] KVC images

KVC для itemStudy:

2010-05-27 10:46:40.336 OsiriX[27266:a0f] KVC accessionNumber
2010-05-27 10:46:40.336 OsiriX[27266:a0f] KVC comment
2010-05-27 10:46:40.336 OsiriX[27266:a0f] KVC date
2010-05-27 10:46:40.336 OsiriX[27266:a0f] KVC dateAdded
2010-05-27 10:46:40.336 OsiriX[27266:a0f] KVC dateOfBirth
2010-05-27 10:46:40.336 OsiriX[27266:a0f] KVC dateOpened
2010-05-27 10:46:40.337 OsiriX[27266:a0f] KVC dictateURL
2010-05-27 10:46:40.337 OsiriX[27266:a0f] KVC expanded
2010-05-27 10:46:40.337 OsiriX[27266:a0f] KVC hasDICOM
2010-05-27 10:46:40.337 OsiriX[27266:a0f] KVC id
2010-05-27 10:46:40.337 OsiriX[27266:a0f] KVC institutionName
2010-05-27 10:46:40.337 OsiriX[27266:a0f] KVC lockedStudy
2010-05-27 10:46:40.337 OsiriX[27266:a0f] KVC modality
2010-05-27 10:46:40.338 OsiriX[27266:a0f] KVC name
2010-05-27 10:46:40.338 OsiriX[27266:a0f] KVC numberOfImages
2010-05-27 10:46:40.338 OsiriX[27266:a0f] KVC patientID
2010-05-27 10:46:40.338 OsiriX[27266:a0f] KVC patientSex
2010-05-27 10:46:40.338 OsiriX[27266:a0f] KVC patientUID
2010-05-27 10:46:40.338 OsiriX[27266:a0f] KVC performingPhysician
2010-05-27 10:46:40.339 OsiriX[27266:a0f] KVC referringPhysician
2010-05-27 10:46:40.339 OsiriX[27266:a0f] KVC reportURL
2010-05-27 10:46:40.339 OsiriX[27266:a0f] KVC stateText
2010-05-27 10:46:40.339 OsiriX[27266:a0f] KVC studyInstanceUID
2010-05-27 10:46:40.339 OsiriX[27266:a0f] KVC studyName
2010-05-27 10:46:40.339 OsiriX[27266:a0f] KVC windowsState
2010-05-27 10:46:40.339 OsiriX[27266:a0f] KVC albums
2010-05-27 10:46:40.340 OsiriX[27266:a0f] KVC series

Если я использую код:

NSDictionary *props = [[item entity] propertiesByName];
 for (NSString *s in [props allKeys]) {
  NSLog(@"KVC %@", s);
 }

И все же itemStudy не выдает ошибку, если я позвоню [itemStudy valueForKey:@"type"], когда это должно произойти, потому что для @"type" нет KVC !!!

Конечно, объекты разные, но ни один из них не содержит ключа @"type", и они оба должны выдавать ошибки, но код Osirix проверяет оба условия:

if ([[item valueForKey:@"type"] isEqualToString:@"Series"]) {
...
}
if ([[item valueForKey:@"type"] isEqualToString:@"Study"]) {
...
}

и не выдает ошибок. Тем не менее, когда я загружаю NSManagedObject той же самой точной модели и сущности @"Series", он выдает «значение ключа не имеет» при переходе в вышеуказанные условия.

Я что-то упустил? И superentity, и subentities itemSeries и itemStudy имеют значение nil, поэтому они не наследуются от чего-то, имеющего KVC @"type".

Я в полном недоумении, чтобы объяснить, что происходит.

--- РЕДАКТИРОВАТЬ ---

Я знаю, что никто не может объяснить, что происходит ... но, может быть, с чего начать? Откуда у itemStudy дополнительный KVC @ "type", который не отображается в списке его свойств?

Спасибо за помощь,

-Stephen

--- РЕДАКТИРОВАТЬ ---

Хорошо, так что, покопавшись, я думаю, что это недоразумение CoreData с моей стороны.

API включает классы DicomSeries и DicomStudy, которые являются подклассами NSManagedObject и включены в файл xcdatamodel.

Я включаю файл xcdatamodel в качестве «скомпилированного источника» и DicomSeries.h и DicomStudy.h

DicomSeries и DicomStudy жестко закодированы с:

- (NSString*) type
{
    return @"Series";
}

Но объекты, которые я создаю для itemStudy Никогда не вызывайте этот метод. Объекты, созданные как itemStudy выше, делайте. Даже DicomSeries объекты, вызываемые в основной программе, делают. Но не те, которые я делаю с запросом на выборку из той же базы данных.

Даже если я это сделаю:

DicomSeries *itemSeries = [_context executeFetchRequest:request]

Если запрос имеет сущность @"Series" класса DicomSeries, поэтому он ДОЛЖЕН ответить на:

[itemSeries valueForKey:@"type"];

но это не так.

Я чувствую, что в CoreData пропал огромный гигантский пробел. Мой NSManagedObjectModel, который я использую в своем постоянном Store Coordinator, и мой контекст имеет Entities для Series и имеет managedObjectClassName DicomSeries, так что ...

да.

LOL, WUT?

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Я знаю, что никто не может объяснить, что происходит ... но, может быть, с чего начать? Откуда у itemStudy дополнительный KVC @ "type", который не отображается в списке его свойств?

Это может быть связано с тем, что класс элемента реализует KVC-совместимое свойство "тип", в то время как объект клиента не имеет этого свойства. Список свойств возвращает только свойства, определенные Базовым объектом данных

Взгляните на

unsigned int total_method_count = 0;
Method * method_list = class_copyMethodList(object_getClass([self class]), &total_method_count);
@try
{
    int method_counter = 0;
    for (method_counter = 0; method_counter < total_method_count; method_counter++)
    {
        Method method = method_list[method_counter];
        // check if method the KVC getter you are interested in

    }
}
0 голосов
/ 02 июня 2010

Ответ на этот вопрос был фактически решен путем решения моего другого вопроса, здесь .

Спасибо за помощь.

...