我正在尝试从未记录的 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".
这让我彻底困惑。如果我打印 itemSeries 的 KVC 值,我会得到这个列表:
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
itemStudy 的 KVC 是这样的:
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"]
,因为没有 KVC for @"type"
!!!
当然,对象是不同的,但它们都不包含密钥@"type"
,它们都应该抛出错误,但是 Osirix 代码测试了这两种情况:
if ([[item valueForKey:@"type"] isEqualToString:@"Series"]) {
...
}
if ([[item valueForKey:@"type"] isEqualToString:@"Study"]) {
...
}
并且不会引发任何错误。然而,当我加载NSManagedObject
相同的模型和实体@"Series"
时,它会在传递到上述条件时抛出“无键值”。
我错过了什么吗?itemSeriessuperentity
和subentities
itemStudy 的 and 都是nil
这样,它们不会从具有 KVC 的东西继承@"type"
。
我完全无法解释发生了什么。
- - 编辑 - -
我知道没有人能解释发生了什么……但也许从哪里开始寻找?itemStudy 怎么会有额外的 KVC @"type" 没有出现在它的属性列表中?
谢谢您的帮助,
-斯蒂芬
- - 编辑 - -
好的,所以在深入研究之后,我认为这是我对 CoreData 的误解。
API 包括类DicomSeries
,DicomStudy
它们是 NSManagedObject 的子类,并包含在 xcdatamodel 文件中。
我将 xcdatamodel 文件作为“编译源”以及 DicomSeries.h 和 DicomStudy.h
DicomSeries
并且DicomStudy
是“硬编码”的:
- (NSString*) type
{
return @"Series";
}
但是我创建的对象itemStudy
从不调用这个方法。像itemStudy
上面那样创建的对象,做。甚至DicomSeries
在主程序中调用的对象也可以。但不是我使用来自同一数据库的 fetch 请求。
即使我这样做:
DicomSeries *itemSeries = [_context executeFetchRequest:request]
@"Series"
如果请求具有属于 Class的实体,DicomSeries
因此它应该响应:
[itemSeries valueForKey:@"type"];
但事实并非如此。
我觉得我错过了一个巨大的 CoreData 差距。我NSManagedObjectModel
在我的持久商店协调器中使用的我和我的上下文有实体,Series
并且是managedObjectClassName
DicomSeries
这样的......
是的。
大声笑,哇?