【问题标题】:Mystery Key Value Coding Key神秘键值编码键
【发布时间】:2011-02-24 20:26:35
【问题描述】:

我正在尝试从未记录的 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 valueForKey:@"type"]itemStudy 不会引发错误,因为 @"type" 没有 KVC!

当然,对象是不同的,但它们都不包含键 @"type",它们都应该抛出错误,但 Osirix 代码测试了这两种情况:

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

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

我错过了什么吗? itemSeries 和 itemStudy 的 superentitysubentities 都是 nil,因此它们不会从具有 KVC @"type" 的东西继承。

我完全无法解释发生了什么。

--- 编辑 ---

我知道没有人可以解释发生了什么...但也许从哪里开始寻找? itemStudy 怎么会有额外的 KVC @"type" 没有出现在它的属性列表中?

感谢您的帮助,

-斯蒂芬

--- 编辑 ---

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

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

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

DicomSeriesDicomStudy 被“硬编码”为:

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

但是我为itemStudy 创建的对象从不调用这个方法。像上面的itemStudy 这样创建的对象,做。甚至在主程序中调用的 DicomSeries 对象也可以。但不是我使用来自同一数据库的 fetch 请求。

即使我这样做:

DicomSeries *itemSeries = [_context executeFetchRequest:request]

如果请求具有实体 @"Series",它属于 DicomSeries 类,因此它应该响应:

[itemSeries valueForKey:@"type"];

但事实并非如此。

我觉得我缺少一个巨大的 CoreData 差距。我在持久存储协调器中使用的NSManagedObjectModel 和我的上下文具有Series 的实体,并且属于managedObjectClassName DicomSeries 所以...

是的。

哈哈,哇?

【问题讨论】:

    标签: objective-c sqlite core-data nsmanagedobject


    【解决方案1】:

    我知道没有人可以解释发生了什么...但也许从哪里开始寻找? itemStudy 怎么会有额外的 KVC @"type" 没有出现在它的属性列表中?

    这可能是因为项目的类实现了符合 KVC 的属性“类型”,而客户端的实体没有此属性。属性列表只返回 Core Data 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
    
        }
    }
    

    【讨论】:

    • 这很好,但它给了我像 _retain_1 这样的东西,它看起来更像 NSObject 方法,而不是对象所拥有的任何东西。 @"type"
    【解决方案2】:

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

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多