Модель данных для моего приложения на основе документов Core Data (только 10.5) находится в
инфраструктура, поэтому автоматическое обновление схемы с использованием отображения основных данных
модель не работает Похоже, что механизм основных данных
не находит подходящих моделей данных или картографической модели, когда они
не в основной комплект приложения. Таким образом, вместо использования автоматического
миграция, я запускаю миграцию вручную в
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];