我的基于 Core Data 文档的应用程序(仅限 10.5)的数据模型位于框架中,因此使用 Core Data 映射模型的自动模式升级似乎不起作用。当 Core Data 机器不在应用程序的主包中时,它们似乎找不到合适的数据模型或映射模型。因此,我没有使用自动迁移,而是
configurePersistentStoreCoordinatorForURL:ofType:...
在我的
NSPersistenDocument
子类(下面的代码)。我将持久存储迁移到一个临时文件,然后在迁移成功时覆盖现有文件。然后该文档显示错误消息“自从您打开或保存此文档的文件已被另一个应用程序更改”。当我尝试保存时。正如此列表中的其他人所指出的,这是由于我在“背后”修改了文档的文件。我尝试更新文档的文件修改日期,如下所示,但随后出现错误对话框,显示消息“无法确定文档“test.ovproj”的位置。” 当我尝试保存时。我不太确定这个错误的原因,但是将一个不必要的消息(在这种情况下)换成另一个并不是我想要的。
任何人都可以提供一些指导吗?有没有办法手动升级文档持久存储的架构而不触发其中一个(在这种情况下是不必要的)警告?
用于升级我的子类中的数据存储的代码
-configurePersistentStoreCoordinatorForURL:ofType:...
:
if(upgradeNeeded) {
NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:VUIModelBundles() orStoreMetadata:meta];
if(sourceModel == nil) {
*error = [NSError errorWithDomain:VUIErrorDomainn ode:VUICoreDataErrorCode localizedReason:BWLocalizedString(@"Unable to find original data model for project.")];
return NO;
}
NSManagedObjectModel *destinationModel = [self managedObjectModel];
NSMigrationManager *migrationManager = [[NSMigrationManager alloc] initWithSourceModel:sourceModel destinationModel:destinationModel];
NSMappingModel *mappingModel = [NSMappingModel mappingModelFromBundles:VUIModelBundles() forSourceModel:sourceModel destinationModel:destinationModel];
if(mappingModel == nil) {
*error = [NSError errorWithDomain:VUIErrorDomain code:VUICoreDataErrorCode localizedReason:BWLocalizedString(@"Unable to find mapping model to convert project to most recent project format.")];
return NO;
}
@try {
//move file to backup
NSAssert([url isFileURL], @"store url is not a file URL");
NSString *tmpPath = [NSString tempFilePath];
id storeType = [meta objectForKey:NSStoreTypeKey];
if(![migrationManager migrateStoreFromURL:url
type:storeType
options:storeOptions
withMappingModel:mappingModel
toDestinationURL:[NSURLfileURLWithPath:tmpPath]
destinationType:storeType
destinationOptions:storeOptions
error:error]) {
return NO;
} else {
//replace old with new
if(![[NSFileManager defaultManager] removeItemAtPath:[url path] error:error] ||
![[NSFileManager defaultManager] moveItemAtPath:tmpPath toPath:[url path] error:error]) {
return NO;
}
// update document file modification date to prevent warning (#292)
NSDate *newModificationDate = [[[NSFileManager defaultManager] fileAttributesAtPath:[url path] traverseLink:NO] bjectForKey:NSFileModificationDate];
[self setFileModificationDate:newModificationDate];
}
}
@finally {
[migrationManager release];
}
}
}
return [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:storeOptions error:error];