1

Core Data を使用してストレージを行う iPhone アプリがあります。デプロイに成功し、現在は 2 番目のバージョンに取り組んでいます。永続ストアがアップグレードされた時点でいくつかの非常に単純なデータ変換が必要になるデータ モデルで問題が発生したため、デフォルトの推論されたマッピング モデルをそのまま使用することはできません。

私のオブジェクト モデルは、バージョン 1.0 と 1.1 が隣り合った .xcdatamodeld バンドルに格納されています。バージョン 1.1 がアクティブ バージョンとして設定されます。デフォルトの移行動作を使用し、NSInferMappingModelAutomaticallyOption を YES に設定すると、すべて正常に動作します。私の sqlite ストレージは、モデルの 1.0 バージョンからアップグレードされ、もちろん、必要ないくつかの変換を除いて、すべてが良好です。

追加の実験的ステップとして、新しいマッピング モデルをコア データ モデル バンドルに追加しましたが、xcode が生成したものには変更を加えていません。アプリを (古いバージョンのデータ ストアで) 実行すると、次のようになります。

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'

私は何を間違っていますか?管理対象オブジェクト モデルと永続ストア コーディネーターを取得するためのコードを次に示します。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"gti_store.sqlite"]];

    NSError *error;
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                                                   configuration:nil 
                                                             URL:storeUrl 
                                                         options:options 
                                                           error:&error]) {
        NSLog(@"Eror creating persistent store coodinator - %@", [error localizedDescription]);
    }    

    return _persistentStoreCoordinator;
}


- (NSManagedObjectModel *)managedObjectModel {

    if(_managedObjectModel == nil) {

        _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
        NSDictionary *entities = [_managedObjectModel entitiesByName];

        //add a sort descriptor to the 'Foo' fetched property so that it can have an ordering - you can't add these from the graphical core data modeler
        NSEntityDescription *entity = [entities objectForKey:@"Foo"];   
        NSFetchedPropertyDescription *fetchedProp = [[entity propertiesByName] objectForKey:@"orderedBar"];
        NSSortDescriptor* sortDescriptor =  [[[NSSortDescriptor alloc] initWithKey:@"index" ascending:YES] autorelease];
        NSArray* sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
        [[fetchedProp fetchRequest] setSortDescriptors:sortDescriptors];
    }
    return _managedObjectModel;
}
4

4 に答える 4

5

私はこれをあまり注意深く考えていませんでした。同じ問題を抱えていたので、これは単なる観察であり、ウェブ上でこのエラーへの参照もほとんど見つかりませんでした.

私の場合、問題は、アプリケーションのオブジェクトの1つを監視するようにセットアップしたことでした

NSManagedObjectContextObjectsDidChangeNotification など

        [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(observeContextSave:)
                                                 name:NSManagedObjectContextDidSaveNotification
                                               object:nil];


- (void) observeContextSave:(NSNotification*) notification {
[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];}

移行後に実行されるようにこのコードを移動すると、エラーはなくなりました。

ともかく。きっとあなたの状況は違うと思います。ただし、managedObjectContext からの通知に対して設定した監視について考えると役立つ場合があります。

更新:これについてもう少し考えてみると、移行中に複数の永続ストアが作成されるために発生すると思います。つまり、別の永続ストアを持つコンテキストから、mergeChangesFromContextDidSaveNotification が送信されたコンテキストに NSManagedObjectContextDidSaveNotification が送信されます。

于 2010-04-26T07:02:40.673 に答える
4

最初に、マッピング モデルがある場合は自動移行をオフにします。モデルが衝突する可能性は十分にあります。それが完了したら、エラーがなくなったことを確認します。

于 2010-03-16T19:36:37.120 に答える
0

永続ストアの初期化がセカンダリスレッドから実行されたときに、同様の問題が発生しました。プライマリスレッドで初期化を強制した後、問題は解決しました。変。

于 2010-09-20T13:36:58.603 に答える
0

すでに修正されているようですが、言及する価値があります。私もこのエラーが発生しました。その理由は、複数の MOC がmergeChangesFromContextDidSaveNotification異なる永続ストア (または異なるスキーマ) を持っている間に通知されていたためです。彼らは、店舗に属さない変更を処理する方法を知りませんでした。

于 2013-01-23T21:34:24.773 に答える