【发布时间】:2014-02-12 07:49:27
【问题描述】:
当我开始开发应用程序时,我有一个 核心数据模型,其中包含 5 个实体(名为 Visitors, UnreadMessages, ContactStatuses, UserVCard 和 User)。该应用程序已在应用程序商店上线.. 没问题.. 现在我必须添加一些需求更改,因此核心数据模型通过添加 2 个以上实体 (命名为 AudioSupportedWindows和AudioMessages)
所以根据很多文章、SO 帖子和苹果文档,迁移的方法是 LightWeight 迁移,因此我添加了以下代码
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Handle error
NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}
在我的persistentStoreCoordinator 方法中。但它总是给出 Can't find model for source store 错误。
之后,我根据此链接 Core Data - Default Migration ( Manual ) 使用迁移映射开始手动迁移
但是当我运行它时,我得到了源模型和目标模型,但它们是相同的,即它们都包含 5 个实体。我收到此错误 The model used to open the store is incompatible with the one used to create the store
他们陷入了严重的麻烦,现在正在解决这个问题……任何帮助将不胜感激。
编辑 1
- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel != nil)
{
return managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"UserData" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel;
}
【问题讨论】:
-
在应用程序部署给用户后,您绝不能更改应用程序的数据模型。您需要创建模型的新版本,以便它们都在应用程序中。如果您已更改它,则需要返回到代码的先前版本(使用 git 或您用于版本控制的任何东西),或从先前的备份。然后使用您的应用中包含的两个模型重试。
-
您说永远不要更改数据模型真是太奇怪了。应用程序可能会发生需求更改或添加。然后您肯定需要更改模型。跨度>
-
不,您是说您的应用已在应用商店上线。然后,您可能有多个用户将您的应用程序与您当前的数据模型一起使用。如果您需要更改该数据模型,则不能只更改当前模型,因为这将禁用您的应用程序使用当前核心数据存储(因为数据模型不再与存储匹配)。我的意思是你需要在xcode中创建一个新版本(一个副本),然后更改副本。这样,您的应用现在包含两个版本的数据模型:一个在您的用户拥有的应用中使用,另一个是您要迁移到的新模型
-
他说的是你不能改变你的数据模型,而是创建它的新版本并修改新版本。
-
ohk.. 所以问题仍然是将模型迁移到更改后的模型..
标签: ios objective-c core-data