我正在尝试迁移
我有两个版本的模型
1.xcdatamodel
2.xcdatamodel
我创建了从版本1到2的映射模型
1to2.xcmappingmodel
问题是它无法找到我创建的迁移模型,因此mappingModel始终为nil。 有什么我需要做的来指定它可以使用哪个mappingModel?
target = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];
//target and source are initialized correctly
mappingModel = [NSMappingModel mappingModelFromBundles:nil forSourceModel:source destinationModel:target];
答案 0 :(得分:5)
创建映射模型后,可能是您更改了其中一个模型。
即使更改似乎不相关,它也会更改用于查找适当映射模型的模型的哈希值。 至少我刚刚被这种方式所困扰: - )
答案 1 :(得分:4)
如果您已经创建了从1.xcdatamodel到2.xcdatamodel的映射模型并正确配置它,那么您应该可以执行以下操作:[注意:关键是指定 NSMigratePersistentStoresAutomaticallyOption 强>
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (persistentStoreCoordinator)
return persistentStoreCoordinator;
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyStore.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:options
error:&error])
{
// Handle error
NSLog(@"Error adding persistent store...%@", error);
// Handle the error.
NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
if(detailedErrors != nil && [detailedErrors count] > 0)
{
for(NSError* detailedError in detailedErrors)
{
NSLog(@" DetailedError: %@", [detailedError userInfo]);
}
}
else
{
NSLog(@" %@", [error userInfo]);
}
}
else
{
DLog(@"Persistent store added without incident, apparently.");
}
return persistentStoreCoordinator;
}
答案 2 :(得分:0)
要回答原始问题,您的代码看起来不错,但我不是为什么你传递nil作为bundles参数。文档没有说可以。所以:
NSArray *theBundles = [NSArray arrayWithObject:[NSBundle mainBundle]];
mappingModel = [NSMappingModel mappingModelFromBundles:theBundles
forSourceModel:source
destinationModel:target];
答案 3 :(得分:0)
如果你传递nil作为bundle参数,它将需要[NSBundle mainBundle]。
[回答Elise van Looij的问题]