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;
}