我添加了新的模型版本,並將核心數據模型設置爲使用該新版本,但是當應用程序嘗試啓動時出現此錯誤。添加新的核心數據模型版本後出現錯誤
「用於打開持久存儲的託管對象模型版本與用於創建持久存儲的版本不兼容。」
我猜問題是,當前的持久性存儲是舊版本的模型。有沒有一種方法可以刪除它,使它成爲一個新的?我不在乎保存任何數據。
我添加了新的模型版本,並將核心數據模型設置爲使用該新版本,但是當應用程序嘗試啓動時出現此錯誤。添加新的核心數據模型版本後出現錯誤
「用於打開持久存儲的託管對象模型版本與用於創建持久存儲的版本不兼容。」
我猜問題是,當前的持久性存儲是舊版本的模型。有沒有一種方法可以刪除它,使它成爲一個新的?我不在乎保存任何數據。
您必須在版本之間遷移。根據Apple的文檔,如果更改很簡單,則可以進行輕量級遷移。
添加這些選項到NSPersistentStoreCoordinator似乎工作。
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSURL *url = [applicationFilesDirectory URLByAppendingPathComponent:@"YOURAPP.storedata"];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:options error:&error]) {
[[NSApplication sharedApplication] presentError:error];
[persistentStoreCoordinator release], persistentStoreCoordinator = nil;
return nil;
}
return persistentStoreCoordinator;
找出您的應用存儲文檔的位置並將其放入垃圾桶。
但作爲一個擴展的評論,你不妨檢查各地NSPersistentStoreCoordinator顯性和隱性遷移的可能性和選項。
- (NSPersistentStore *)addPersistentStoreWithType:(NSString *)storeType configuration:(NSString *)configuration URL:(NSURL *)storeURL options:(NSDictionary *)options error:(NSError **)error
根據不同的版本是多麼的不同,你可以得到它的發生自動地通過使NSMigratePersistentStoresAutomaticallyOption
& NSInferMappingModelAutomaticallyOption
也Theres
- (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error
在回答你的問題時,「有沒有辦法刪除它,以便它只是一個新的?」
是的。
只要改變persistentStoreCoordinator吸氣劑應用程式委派如下:
- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
if (persistentStoreCoordinator) return persistentStoreCoordinator;
NSManagedObjectModel *mom = [self managedObjectModel];
if (!mom) {
NSAssert(NO, @"Managed object model is nil");
NSLog(@"%@:%s No model to generate a store from", [self class], (char *)_cmd);
return nil;
}
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *applicationSupportDirectory = [self applicationSupportDirectory];
NSError *error = nil;
if (![fileManager fileExistsAtPath:applicationSupportDirectory isDirectory:NULL]) {
if (![fileManager createDirectoryAtPath:applicationSupportDirectory withIntermediateDirectories:NO attributes:nil error:&error]) {
NSAssert(NO, ([NSString stringWithFormat:@"Failed to create App Support directory %@ : %@", applicationSupportDirectory,error]));
NSLog(@"Error creating application support directory at %@ : %@",applicationSupportDirectory,error);
return nil;
}
}
NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @"storedata"]];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: mom];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType
configuration:nil
URL:url
options:nil
error:&error]){
// EDIT: if error opening persistent store, remove it and create a new one
if([[error domain] isEqualToString:@"NSCocoaErrorDomain"] && [error code] == 134100) {
NSLog(@"Core Data model was updated. Deleting old persistent store.");
[[NSFileManager defaultManager] removeItemAtURL:url error:nil];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType
configuration:nil
URL:url
options:nil
error:&error]){
[[NSApplication sharedApplication] presentError:error];
[persistentStoreCoordinator release], persistentStoreCoordinator = nil;
return nil;
}
} else {
[[NSApplication sharedApplication] presentError:error];
[persistentStoreCoordinator release], persistentStoreCoordinator = nil;
return nil;
}
//
}
return persistentStoreCoordinator;
}