2010-05-27 103 views
0

我正在嘗試從未公開的API(OsiriX)加載數據。Mystery Key Value Coding Key

獲取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"]當它應該因爲沒有KVC @"type" !!!

當然,對象是不同的,但是他們都沒有包含關鍵@"type",他們都應該拋出錯誤,但是這兩種情況的Osirix代碼測試:

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

,並拋出任何錯誤。然而,當我加載相同確切模型的NSManagedObject和實體@"Series"時,它會在傳入上述條件時拋出「無關鍵值」。

我錯過了什麼嗎? itemSeries和itemStudy的superentitysubentities都是nil,所以它們不會從具有KVC @"type"的東西繼承。

我完全無法解釋發生了什麼事。

---編輯---

我知道沒有人能解釋這是怎麼回事......但也許從哪裏開始尋找? itemStudy如何擁有額外的KVC @「type」,它不會顯示在它的屬性列表中?

謝謝您的幫助,

-Stephen

---編輯---

行,所以周圍挖後,我越覺得這是我的一個CoreData誤解。

該API包括類別DicomSeriesDicomStudy,它們是NSManagedObject的子類幷包含在xcdatamodel文件中。

我包含xcdatamodel文件作爲「編譯源代碼」和DicomSeries.h和DicomStudy。^ h

DicomSeriesDicomStudy是 「硬編碼」 有:

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

但對象創建爲itemStudy不要調用此方法。上面創建的對象類似itemStudy。即使在主程序中調用的對象也是如此。但不是我用同一​​個數據庫的獲取請求做的。

即使我做的:

DicomSeries *itemSeries = [_context executeFetchRequest:request] 

凡要求具有實體@"Series"這是DicomSeries類的,所以應該回應:

[itemSeries valueForKey:@"type"]; 

但事實並非如此。

我覺得我缺少的CoreData有一個巨大的缺口。我NSManagedObjectModel說我用我的持久存儲協調員和我的背景有Series實體,是managedObjectClassNameDicomSeries所以...

耶。

lol,wut?

回答

0

回答這個問題其實是由解決我的其他問題,here解決。

感謝您的幫助。

1

我知道沒有人可以解釋發生了什麼......但也許從哪裏開始尋找? 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

這很好,但它給了我像_retain_1這樣的東西,它看起來更像是NSObject方法,而不是對象所具有的東西。 「@」類型「'什麼都沒有」 – 2010-05-28 14:49:21

相關問題