神秘键值编码密钥

时间:2010-05-27 20:03:10

标签: objective-c sqlite core-data nsmanagedobject

我正在尝试从未记录的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"],则@"type"没有错误,因为@"type"没有KVC!

当然,对象是不同的,但它们都不包含键if ([[item valueForKey:@"type"] isEqualToString:@"Series"]) { ... } if ([[item valueForKey:@"type"] isEqualToString:@"Study"]) { ... } ,它们都应该抛出错误,但是Osirix代码测试两种条件:

NSManagedObject

并且不会抛出任何错误。然而,当我加载@"Series"相同的模型和实体superentity时,它会在传递到上述条件时抛出'无键值'。

我错过了什么吗? itemSeries和itemStudy的subentitiesnil都是@"type",因此它们不会从具有KVC DicomSeries的内容继承。

我完全不知道要解释发生了什么。

---编辑---

我知道没有人可以解释发生了什么......但也许从哪里开始寻找? itemStudy如何拥有未出现在其属性列表中的额外KVC @“类型”?

感谢您的协助,

-Stephen

---编辑---

好的,所以在深入挖掘之后,我认为这是我对CoreData的误解。

API包括类DicomStudyDicomSeries,它们是NSManagedObject的子类,包含在xcdatamodel文件中。

我将xcdatamodel文件包含为“编译源代码”和DicomSeries.h和DicomStudy.h

DicomStudy- (NSString*) type { return @"Series"; } 是“硬编码”的:

itemStudy

但我为itemStudy创建的对象从不调用此方法。创建的对象如上面的DicomSeries一样。即使在主程序中调用的DicomSeries *itemSeries = [_context executeFetchRequest:request] 个对象也可以。但不是我用来自同一数据库的获取请求的那些。

即使我这样做:

@"Series"

如果请求的实体DicomSeries属于[itemSeries valueForKey:@"type"]; 类,那么它应该回复:

NSManagedObjectModel

但事实并非如此。

我觉得CoreData有一个巨大的巨大缺口我不知道。我在我的持久商店协调员和我的上下文中使用的Series具有managedObjectClassName的实体,且DicomSeries {{1}}所以......

耶。

大声笑,哇?

2 个答案:

答案 0 :(得分:1)

  

我知道没有人可以解释发生了什么......但也许从哪里开始寻找? itemStudy如何拥有未出现在其属性列表中的额外KVC @“类型”?

这可能是因为Item类实现了KVC兼容属性“type”而客户端的Entity没有此属性。属性列表仅返回核心数据实体定义的属性

看看

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

    }
}

答案 1 :(得分:0)

这个问题的答案实际上是通过解决我的另一个问题here来解决的。

感谢您的帮助。