Я пытаюсь загрузить данные из недокументированного 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?