文書化されていない 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);
}
KVCがないため、必要なときitemStudy
に呼び出してもエラーはスローされません!!! [itemStudy valueForKey:@"type"]
@"type"
確かに、オブジェクトは異なりますが、どちらもキー@"type"
を含んでおらず、どちらもエラーをスローするはずですが、Osirix コードは両方の条件をテストします。
if ([[item valueForKey:@"type"] isEqualToString:@"Series"]) {
...
}
if ([[item valueForKey:@"type"] isEqualToString:@"Study"]) {
...
}
エラーは発生しません。しかし、NSManagedObject
まったく同じモデルとエンティティをロードすると、@"Series"
上記の条件に渡されたときに「キー値なし」がスローされます。
何か不足していますか?itemSeries と itemStudy のsuperentity
andsubentities
は、nil
KVC を持つものから継承しないようにするためです@"type"
。
何が起こっているのかを説明するのに完全に途方に暮れています。
- - 編集 - -
何が起こっているのか誰も説明できないことはわかっています...しかし、どこから調べ始めればよいのでしょうか? itemStudy は、そのプロパティ リストに表示されない余分な KVC @"type" をどのように持つのでしょうか?
ご協力いただきありがとうございます、
-スティーブン
- - 編集 - -
わかりましたので、さらに掘り下げた後、これは私の側の CoreData の誤解だと思います。
API には、NSManagedObject のサブクラスであり、xcdatamodel ファイルに含まれているクラスDicomSeries
とクラスが含まれています。DicomStudy
「コンパイル済みソース」として xcdatamodel ファイルと DicomSeries.h および DicomStudy.h を含めています。
DicomSeries
次のようにDicomStudy
「ハードコード」されています。
- (NSString*) type
{
return @"Series";
}
itemStudy
しかし、 Never用に作成したオブジェクトは、このメソッドを呼び出しません。上記のようにオブジェクトを作成itemStudy
します。DicomSeries
メインプログラム内で呼び出されるオブジェクトでさえそうです。しかし、同じデータベースからのフェッチ要求で作成したものではありません。
私がしても:
DicomSeries *itemSeries = [_context executeFetchRequest:request]
@"Series"
リクエストに Class のエンティティがある場合、次のDicomSeries
ように応答する必要があります。
[itemSeries valueForKey:@"type"];
しかし、そうではありません。
私が見逃している CoreData には大きなギャップがあるように感じます。私NSManagedObjectModel
は永続的なストア コーディネーターで使用しており、コンテキストにはエンティティがSeries
あり、managedObjectClassName
DicomSeries
それは...
うん。
笑、えっ?