0

文書化されていない 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 のsuperentityandsubentitiesは、nilKVC を持つものから継承しないようにするためです@"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それは...

うん。

笑、えっ?

4

2 に答える 2

1

何が起こっているのか誰も説明できないことを私は知っています...しかし、おそらくどこから探し始めるのですか?itemStudyには、プロパティリストに表示されない余分なKVC @ "type"がどのようにありますか?

これは、アイテムのクラスがKVC準拠のプロパティ「type」を実装しているのに対し、クライアントのエンティティにはこのプロパティがないことが原因である可能性があります。プロパティリストは、CoreDataエンティティで定義されたプロパティのみを返します

を見てみましょう

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

    }
}
于 2010-05-28T09:47:30.300 に答える
0

この質問への答えは、実際には私の他の質問hereを解決することで解決されました。

助けてくれてありがとう。

于 2010-06-02T13:40:48.673 に答える