0

私は文書化されていない API (Osirix) を使用しており、ここに投稿した質問の姉妹の質問があります。

管理対象オブジェクト コンテキストからのオブジェクトの読み込みに問題があります。

_context と _model のインスタンスを使用して、API から読み込みます

2010-05-28 14:05:13.588 OsiriX[44012:a0f] Entity: Study
2010-05-28 14:05:13.589 OsiriX[44012:a0f] EntityClassName: DicomStudy
2010-05-28 14:05:13.589 OsiriX[44012:a0f] ClassName: DicomStudy

Fetch Request (および _context と _model の独自のインスタンス) からの読み込み

2010-05-28 14:19:09.956 rcOsirix[44431:7a03] Entity: Study
2010-05-28 14:19:09.957 rcOsirix[44431:7a03] EntityClassName: DicomStudy
2010-05-28 14:19:09.958 rcOsirix[44431:7a03] ClassName: NSManagedObject

出力:

NSLog(@"Entity: %@",[[item entity] name]);
NSLog(@"EntityClassName: %@", [[item entity] managedObjectClassName]);
NSLog(@"ClassName: %s", class_getName(object_getClass([item class])));

したがって、エンティティが DicomSeries であると考えていても、そうではないことは明らかです。それは単なる NSManagedObject です。DicomSeriesには、他の質問で問題に遭遇した「ハードコードされた」KVCのものがあります。

私はこのスレッドで別の推論を追求しています - オブジェクトの読み込みです。

以下は彼らのコードです:

- (NSManagedObjectModel *)managedObjectModel
{
    if (managedObjectModel) return managedObjectModel;

    NSMutableSet *allBundles = [[NSMutableSet alloc] init];
    [allBundles addObject: [NSBundle mainBundle]];
    [allBundles addObjectsFromArray: [NSBundle allFrameworks]];

    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL: [NSURL fileURLWithPath: [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"/OsiriXDB_DataModel.mom"]]];
    [allBundles release];

    return managedObjectModel;
}

- (NSManagedObjectContext *) managedObjectContextLoadIfNecessary:(BOOL) loadIfNecessary
{
    NSError *error = nil;
    NSString *localizedDescription;
    NSFileManager *fileManager;

    if( currentDatabasePath == nil)
        return nil;

    if (managedObjectContext)
        return managedObjectContext;

    if( loadIfNecessary == NO) return nil;

    fileManager = [NSFileManager defaultManager];

    [persistentStoreCoordinator release];

    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: self.managedObjectModel];

    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator: persistentStoreCoordinator];

    NSURL *url = [NSURL fileURLWithPath: currentDatabasePath];

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error])
    {
        NSLog(@"********** managedObjectContextLoadIfNecessary FAILED: %@", error);
        localizedDescription = [error localizedDescription];
        error = [NSError errorWithDomain:@"OsiriXDomain" code:0 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:error, NSUnderlyingErrorKey, [NSString stringWithFormat:@"Store Configuration Failure: %@", ((localizedDescription != nil) ? localizedDescription : @"Unknown Error")], NSLocalizedDescriptionKey, nil]];
    }

    [[managedObjectContext undoManager] setLevelsOfUndo: 1];
    [[managedObjectContext undoManager] disableUndoRegistration];

    // This line is very important, if there is NO database.sql file
    [self saveDatabase: currentDatabasePath];

    return managedObjectContext;
}

これは私のコードです:

NSManagedObjectModel* DataModule::managedObjectModel()
{
if (_managedObjectModel) return _managedObjectModel;

    NSMutableSet *allBundles = [[NSMutableSet alloc] init];
    [allBundles addObject: [NSBundle mainBundle]];
    [allBundles addObjectsFromArray: [NSBundle allFrameworks]];

_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL: [NSURL fileURLWithPath: [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"/OsiriXDB_DataModel.mom"]]];

    [allBundles release];

return [_managedObjectModel retain];
}

...
        NSError *error = nil;
        [_storeCoordinator release];

        _storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel()];

        _context = [[NSManagedObjectContext alloc] init];
        [_context setPersistentStoreCoordinator: _storeCoordinator];

        NSURL *url = [NSURL fileURLWithPath: [[NSString alloc] initWithCString:_DBPath.c_str()]];

        if (url == nil) { [pool release]; _loadLock = false; return nil; }

        if (![_storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error])
        {
            NSLog(@"********** managedObjectContextLoadIfNecessary FAILED: %@", error);
            NSString *localizedDescription = [error localizedDescription];
            error = [NSError errorWithDomain:@"OsiriXDomain" code:0 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:error, NSUnderlyingErrorKey, [NSString stringWithFormat:@"Store Configuration Failure: %@", ((localizedDescription != nil) ? localizedDescription : @"Unknown Error")], NSLocalizedDescriptionKey, nil]];

            //Exit Failure
            [pool release]; _loadLock = false; return nil;
        }

        [[_context undoManager] setLevelsOfUndo: 1];
        [[_context undoManager] disableUndoRegistration];
...

私はすべて同じフレームワークを含めています....しかし、_allBundlesの作成にも使用されていないため、ロード中にそれらを見ることができるようにmanagedObjectModel、それらをメモリにロードする以外に何をすべきかわかりませんmom

完全に失われました。

ヘルプ!

NSManagedObjects同じ Entity を持つ FetchRequest によって返されたオブジェクトが sではなくDicomStudysとして出てくるのはなぜですか? モデル、コンテキスト、およびフェッチ要求の作成中にオブジェクトが表示されるように、DicomStudy.h を含めています。

[request setEntity: [[managedObjectModel() entitiesByName] objectForKey:@"Study"]];

前もって感謝します、

-スティーブン

4

2 に答える 2

1

モデルの最初の質問は、Core DataにDicomStudyサブクラスを使用するように指示していますか、それともNSManagedObjectに設定されていますか(デフォルト)?

アップデート

次に、ログの3行目を次のように変更します。

NSLog(@"ClassName: %@", [item class]);

そして、出力を表示します。

于 2010-05-29T18:39:19.243 に答える
0

フーケー、

私の質問のすべてに答えてくれて、私は巨大な野郎のように感じますが、まあ.

したがって、答えは、私が含めたフレームワークにはコンパイル済みのソースがなかったということです。Apple Dev Forumsの BenT は、ソースをコンパイルする必要があると述べました...そのため、インポートしていたフレームワークを調べたところ、ヘッダー ファイルのみをコピーし、何もコンパイルしないようです。

フレームワークがメイン ソフトウェアのプラグインの一部として使用されることを意図していたため、これが行われました (そのフレームワークの開発者から応答がなかったので、私はそう思います)。プラグイン アーキテクチャはコンパイルされたすべてのクラスをロードするため、フレームワークにヘッダーだけを配置することで、objc[1378]: Class BLAH is implemented in both X and Y. One of the two will be used. Which one is undefined.「楽しい時間」のエラーを防ぐことができます。

そのため、ソースを含めるか、ソースから新しいフレームワークを作成する必要があるようです。

私を助けてくれたマーカスに感謝します。2009 年 11 月から Apple プラットフォームの開発を始めたばかりなので、これが単なる「RTFM」の問題ではないことを願っていました。

-スティーブン

于 2010-06-02T13:04:29.520 に答える